R CI Ppt GitHub forks

Profesor:

Curso:

Integrantes

Líder

Introducción

El COVID-19 ha tenido un gran impacto alrededor del mundo y hoy en dia es fácilmente el tema del que más se habla. Todos los países han tomado medidas con respecto a esta pandemia, sin embargo unos las han tomado muy tarde y esto se ha visto afectado en la expansión del virus en ellos. En Perú, las medidas se empezaron a tomar rápidamente, pero una cantidad considerable de la población no ha cumplido con las inmovilizaciones sociales y esto se ha visto reflejado en la expansión del virus en el país. ¿Cómo podemos saber cuáles han sido las medidas más respetadas y por qué? La respuesta a esta pregunta le sería de mucha ayuda al gobierno peruano, ya que con esta información se podría saber que tipo de medidas debería tomar y en qué momentos para que se cumplan de manera satisfactoria. Es por ello que nuestro grupo ha decidido investigar acerca de la efectividad de las medidas tomadas y su relación con la movilización social de los ciudadanos.

Factibilidad

Este trabajo es factible, debido a que la mayor parte de la información la podemos conseguir de gráficos ya existentes con relación al COVID-19 en Perú y la información faltante la podemos adquirir a través de encuestas. Además, los efectos de las medidas tomadas por el gobierno en la movilización social ya se pueden analizar, debido a que su información se obtiene solamente días después de implementarlas. Finalmente, esta investigación se puede llevar a cabo en el tiempo dado, debido a que no es un trabajo que requiera tiempo de espera para llegar a concretarse. Esto quiere decir que lo podemos empezar inmediatamente.

Objetivos

La importancia de este estudio estadístico radica en el análisis de algunas de las medidas que el gobierno ha declarado ante la coyuntura del Covid-19. Es importante estudiar su efecto en la movilización social, puesto que podría otorgar un panorama más holístico y verídico sobre las medidas que generan un impacto positivo en la desaceleración de la propagación del nuevo virus Sars-CoV-2.

Objectivos generales

  • El objetivo de este trabajo es determinar en qué medida las diferentes acciones que ha aplicado el gobierno, desde el inicio del periodo de cuarentena hasta el tiempo del estudio, redujeron el impacto y expansión del Covid-19 en el Perú. Queremos averiguar el efecto de estas medidas en 2 diferentes aspectos. Estos son: la movilización social y de qué manera afectan la curva de aumento de infectados por coronavirus en Perú.

Objetivos específicos

  • Establecer las medidas a estudiar y que estas se encuentren alineadas a la inmovilización social.
  • Analizar la situación de la ciudad de Lima en el caso hipotético de “Declaración de emergencia fuera de tiempo”.
  • Establecer los factores que determinan la prestación de servicios públicos y su relación con la propagación del virus.
  • Establecer una relación entre el bono subsidio y el desacato a la inmovilización social.
  • Establecer las principales razones de las personas para desobedecer la inmovilización social.

Marco Teórico

Población objetivo

La población de interés son los ciudadanos peruanos. Para lograr que nuestras unidades muestrales sean los más representativa posible, hemos decidido delimitar nuestra población objetivo al área de Lima. Esto se debe a que nuestros encuestados se encuentran en esta zona y la mayor cantidad de población se encuentra aquí.

Unidad muestral

  • Para las encuestas nuestra unidad muestral son los alumnos de la Universidad UTEC y sus familias [18 - 50 años]
  • Con respecto a los datos y gráficos brindados por la web, nuestra unidad muestral es la ciudad de Lima.
  • Accederemos a las observaciones y/o mediciones de las unidades muestrales mediante fuentes de internet que presentan fiabilidad, respaldo del gobierno. Del mismo modo, se realizarán encuestas a los alumnos de UTEC y sus familiares a través de preguntas relacionadas con su movilización social antes y durante la cuarentena. Ello con el propósito de encontrar las razones de movilización

Muestreo

Tipo de muestreo

El tipo de muestreo es aleatorio simple estratificado para ciudadanos con edades entre 18-50 años. Ello, dado que todos los individuos de subconjunto de la población objetivo tienen la misma probabilidad de ser seleccionados.

Tamaño de la muestra

  • Para la investigación, se busca cumplir por lo menos con: <0.05, e<0.05 *Para encontrar un número mínimo de personas a entrevistar, manteniendo una confianza de 95% y margen de error de 5%, se utilizó la siguiente fórmula:

\[n = Z^2p(1-p)/e^2\]

Como no hay todavía datos para obtener el valor real de p, se asume p = 0.5. Con ello, se obtiene un tamaño de muestra de por lo menos 91 personas para ser significativo.

Proveniencia de los datos

Existen varias fuentes de la que es posible extraer la información necesaria para responder las preguntas.

Nota: Todas se encuentran citadas en bibliografía.

La información contenida en estas direcciones son originales, además de confiables, dado que se presenta cada medida con su respectivo decreto legislativo. Asimismo, los datos estadísticos cuentan con sustento de fuentes oficiales.

Uso de datos

Con respecto al uso de los datos obtenidos de fuentes, tenemos claro cómo utilizar cada uno de ellos. La fuente de la que adquirimos la información respecto a las medidas tomadas nos es de mucha ayuda, ya que junto a ellas están las fechas en las que se llevaron a cabo. Esto nos permite analizar la población antes y después de que se implementarán estas medidas.

Las fuentes de las que adquirimos las gráficas de inmovilización social también nos son de gran ayuda porque nos permiten relacionar las fechas en las que se llevaron a cabo las medidas gubernamentales con el flujo de gente en las calles. Esta relación es muy importante, ya que nos permitirá analizar la efectividad de los decretos y nos ayudará a lograr nuestros objetivos. El procesamiento de la data obtenida en las fuentes es muy importante, debido a que por sí solas nos muestran información “cruda” que todo el mundo ya conoce. Al procesar esta data y relacionarla con otra/s, la investigación se vuelve más interesante, ya que las relaciones entre diferentes estadísticas son posiblemente desconocidas y le brindan información mucho más útil al lector.

Planificación

Medidas elegidas

  1. Decreto de estado de emergencia.
    • ¿Cuál fue el efecto que tuvo el decreto de estado de emergencia en la población emocionalmente? (Exploratoria)
  2. Decreto de Urgencia que dicta medidas extraordinarias con la finalidad de adquirir bienes y servicios necesarios para el alojamiento en cuarentena y alimentación de las personas que deban desplazarse dentro del país a consecuencia de la declaración del Estado de Emergencia Nacional por el COVID-19 (380)
    • ¿La cantidad de personas que se vieron beneficiadas por este decreto fue suficiente para que se reduzca considerablemente el tránsito de gente? (Inferencial)
  3. Aprueban el Padrón de los hogares en condición de pobreza o pobreza extrema beneficiarios del subsidio monetario de acuerdo al Sistema de Focalización de Hogares (SISFOH) que se encuentren en los ámbitos geográficos con mayor vulnerabilidad sanitaria en el marco del D.U. N° 027-2020 (68)
    • ¿La tasa de personas que reciben la bonificación por día fue alcanzable a la mayoría de personas del sector vulnerable? (Descriptiva)
  4. Disposición presidencial que permite la salida de hombres y mujeres en días complementarios (lunes-miércoles-viernes / martes-jueves-sábados)
    • ¿Qué diferencia hubo en el tránsito de personas entre los días para hombres y para mujeres? (Descriptiva)
    • ¿A dónde se dirige la mayor parte del flujo de personas? ¿Qué razón explicaría esto? (Exploratoria)

Preguntas propuestas para estudio (para los encuestados)

Pregunta Tipo
1 ¿Qué edad tienen los miembros de la muestra? Descriptiva
2 ¿De qué género son? Descriptiva
3 ¿Cuánto es su ingreso promedio? Descriptiva
4 ¿En qué distrito vives? Descriptiva
5 ¿Cuál fue el último nivel educativo que completaste? Descriptiva
6 ¿Su tipo de empleo es formal o informal? Descriptiva
7 ¿Qué tan frecuentemente salía de casa previamente al comienzo de la cuarentena? Descriptiva
8 ¿Qué tanto consideras que tu distrito se ha visto afectado por la enfermedad? Descriptiva
9 ¿Por qué razones salías durante la cuarentena? Descriptiva
10 ¿Consideras que esta medida “c/u de las medidas” fue efectiva para reducir el número de contagios en tu distrito? Descriptiva
11 ¿Qué condiciones crees que aceleran la propagación del Covid en tu distrito? Descriptiva
12 ¿Qué condiciones crees que retardan la propagación del Covid en tu distrito? Descriptiva
13 ¿Qué medidas gubernamentales son las que recuerdas que se hayan tomado? Descriptiva

Preguntas propuestas para estudio (para la data)

Pregunta Tipo
14 ¿Qué tanto varían las cifras de nuevos infectados durante los periodos de instauración previos-posteriores a la medida? Descriptiva
15 ¿Cuáles eran las razones por las que la población salía durante la cuarentena? Descriptiva
16 ¿Cuáles han sido las medidas que han tenido mayor impacto en la población? Descriptiva
17 Existe una misma tendencia de poblaciones afectadas por el Covid 19 durante las medidas de aislamiento? Exploratoria
18 ¿Las medidas en los distritos más exclusivos presentan una mayor o menor efectividad? Exploratoria
19 ¿La entrega de mayores subsidios monetarios resultaría en un importante beneficio para la disminución del número de salidas? Inferencial
20 ¿Es posible predecir cuántas horas en promedio una persona salía de casa conociendo su nivel de ingresos y el distrito de residencia? Predictiva
21 ¿Es posible predecir su nivel de ingresos conociendo únicamente su tipo de empleo? Predictiva
22 ¿Qué factores determinan que la propagación del Covid 19 se desacelere? Causal
23 ¿Cómo ciertas condiciones determinan que la propagación del COVID se acelere / retarde? Mecanística

Variables

Variable Relación con pregunta
Edad 1
Género 2
Clase social 3,17,18,20,21
Nivel educativo alcanzado 5,17,18
Tipo de trabajo 6,18,21
Frecuencia de salida 7,18,19
Lugar donde vive (distrito) 4,17,18,20
Cantidad de infectados por dia 14,19
Justificacion de salida 9,15
Medidas aplicadas 10,16,17,18,19
Factores 22,23

#Descriptores numéricos para las variables de mayor importancia:

##Variables Data web

-Cantidad de personas que se movilizan en las calles antes y después de cada una de las medidas, Tiempo, Medidas aplicadas:

*Media (valor): permitirá conocer en promedio cuántos ciudadanos limeños se movilizan antes y después de la medida

*Mediana, cuartiles (valor): permitirá saber cuántos ciudadanos limeños se movilizan al 25%, 50%; 75%, 100% del tiempo de estudio, de esta manera se conocerá el efecto de la movilización con el transcurso del tiempo para cada medida.

*Desviación estándar: permitirá saber cuántas son las variaciones promedio de movilización social respecto a la media

-Cantidad de infectados por día, Tiempo:

*Media(valor): permitirá conocer cuánto es la tasa infectados que hubo en promedio antes y después de medida aplicada

*Mediana, cuartiles (valor): permitirá saber cuántos infectados hubo al 25%, 50%;75%, 100% del tiempo de estudio, de esta manera se conocerá el efecto del número de infectados con el transcurso del tiempo para cada medida.

*Desviación estándar: permitirá saber cuántas son las variaciones promedio de infectados respecto a la media.

#Variables Encuestas

-Frecuencia de salida promedio a la semana ,antes y después de cada medida del gobierno

Mediana, cuartiles (valor): permitirá saber cuántas salidas a la semana representa 25%,50%,75% de los ciudadanos de Lima encuestados para cada medida

Moda (valor): permitirá saber la frecuencia de salida mayoritaria de los ciudadanos de Lima encuestados

-Tipo de trabajo, Frecuencia de salida promedio a la semana ,antes y después de cada medida del gobierno

Variable dicotomizada Tipo de trabajo=0,1

Coeficiente de correlación biserial: indicará cuán relacionado está el tipo de trabajo con la frecuencia de salida

-Edad, Frecuencia de salida promedio a la semana ,antes y después de cada medida del gobierno, Medida aplicada

Media: permitirá conocer la edad promedio para cada frecuencia de salida promedio y para cada medida

Coeficiente de correlación biserial: indicará cuán relacionado está la edad con la frecuencia de salida

-Distrito, Frecuencia de salida promedio a la semana ,antes y después de cada medida del gobierno y medida aplicada

Moda(valor): permitirá conocer en qué distrito inciden más en las veces de salida de las personas

-Clase social

Moda(valor): permitirá conocer el nivel de ingresos por cada distrito.

#Descriptores gráficos

Utilizaremos:

Gráfica de dispersión para notar fácilmente como aumenta o decrece la cantidad de infectados e infectados por dia antes y después de que se aplique la medida. Además, la gráfica de dispersión nos puede ayudar a encontrar una relación y/o patrón entre la cantidad de infectados y/o movilización social y los días transcurridos desde que se empleó cada medida.

También utilizaremos un gráfico de caja de bigotes para diferenciar las edades de los entrevistados de manera rápida y efectiva. Esto nos permitirá ver la relación entre las edades y respuestas dadas por las personas.

Además, se utilizarán gráficos de barras principalmente para visualizar y analizar las respuestas cualitativas. Con los gráficos de barras se podrán ver cuales han sido las respuestas cualitativas respondidas con más y menos frecuencia.

Finalmente, se usarán histograma para describir las variables cuantitativas que pueden ser distribuidas en rangos. Esto nos facilitará analizar los datos con muchos valores o respuestas posibles.

Plots y otras cosas

# curl -Ls "$url" > df_form.csv

tmp <- tempfile()
curl_download("https://docs.google.com/spreadsheets/d/e/2PACX-1vS5FwsKHl4PhukIHfSGbfA8NCQ5SqBDpQ16KC69JCiFAWVeJ40BACp0dqhBTkHi9cpLE_JmEmIvfdvA/pub?gid=637100843&single=true&output=csv", tmp)
read_csv(tmp) -> df_form1
Parsed with column specification:
cols(
  .default = col_character(),
  `¿Cuál es tu edad?` = col_double(),
  `¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?` = col_double()
)
See spec(...) for full column specifications.
# Segunda encuesta
tmp <- tempfile()
curl_download("https://docs.google.com/spreadsheets/d/e/2PACX-1vS5FwsKHl4PhukIHfSGbfA8NCQ5SqBDpQ16KC69JCiFAWVeJ40BACp0dqhBTkHi9cpLE_JmEmIvfdvA/pub?gid=637100843&single=true&output=csv", tmp)

read_csv(tmp) %>%
    rename(
        tiempo = "Marca temporal",
        edad = "¿Cuál es tu edad?",
        genero = "¿De qué género eres?",
        ingreso = "¿Cuánto es el ingreso mensual promedio de tu familia aproximadamente (soles) ?",
        distrito = "¿En qué distrito vives?",
        estudio = "¿Cuál fue el último nivel educativo que completaste?",
        empleo = "¿Cuál es tu tipo de empleo?",
        salidas = "¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?",
        razones = "¿Por qué razones salías durante la cuarentena?",
        social.bool = "¿La medida de \"Inmovilización social\", realmente hizo que tus salidas durante toda la cuarentena fueran muy pocas?",
        social.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?",
        ocio.bool = "¿ La \"Suspensión de acceso a lugares públicos: lugares de ocio, restaurantes, etc\", te desanimó salir de casa?",
        ocio.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?",
        noday.bool = "¿La medida \"Disposición salida de hombres y mujeres en días complementarios (lunes-miércoles-viernes / martes-jueves-sábados)\", garantizo que salieras menos que antes?",
        noday.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?",
        multa.bool = "¿ La medida \"Multa de S/.86 -S/.340 para todas las personas que desobedecen disposiciones del gobierno\", hizo que tus salidas de casa fueran menores?",
        multa.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?",
        bono.bool = "¿ La medida \"Entrega de bono S/. 380, S/.760 de acuerdo al Sistema de Focalización de Hogares (SISFOH) \", permitió que redujeras tus salidas de casa?",
        bono.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?",
        afp1.bool = "¿ La medida \"Retiro de hasta S/. 2000 de fondos AFP de trabajadores afiliados que no tienen planilla\", te mantuvo más tiempo en casa?",
        afp1.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?",
        afp2.bool = "¿ La medida \"Retiro del 25% de fondos AFP para trabajadores afiliados\", te mantuvo más tiempo en casa?",
        afp2.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?",
        decceleration = "¿Qué condiciones crees que existen en tu distrito que retardan la propagación del Covid?",
        acceleration = "¿Qué condiciones crees que existen en tu distrito que aceleran la propagación del Covid?"
    ) %>%
    mutate(
        genero = as.factor(genero),
        ingreso = as.factor(ingreso),
        distrito = as.factor(distrito),
        estudio = factor(estudio, levels = c("Secundaria", "Técnica", "Universitaria", "Posgrado")),
        empleo = factor(empleo, levels = c("No trabajo", "Informal", "Formal")),
        # Esteban Nicolas Villacorta Garcia cambió las respuestas de la encuesta
        # de "Mayor 5" a 6.
        salidas = replace(salidas, salidas=="6", "Mayor 5"),
        salidas = factor(salidas, levels = c(0:5, "Mayor 5")),
        razones = strsplit(razones, ", "),
        social.bool = social.bool == "Sí" | social.bool == "Si",
        ocio.bool = ocio.bool == "Sí" | ocio.bool == "Si",
        noday.bool = noday.bool == "Sí" | noday.bool == "Si",
        multa.bool = multa.bool == "Sí" | multa.bool == "Si",
        bono.bool = bono.bool == "Sí" | bono.bool == "Si",
        afp1.bool = afp1.bool == "Sí" | afp1.bool == "Si",
        afp2.bool = afp2.bool == "Sí" | afp2.bool == "Si",
        acceleration = strsplit(acceleration, ", "),
        decceleration = strsplit(decceleration, ", ")
    ) -> df_form2
Parsed with column specification:
cols(
  .default = col_character(),
  `¿Cuál es tu edad?` = col_double(),
  `¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?` = col_double()
)
See spec(...) for full column specifications.

Edad de la muestra

summary(df_form2$edad)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   17.0    22.0    28.0    33.4    45.0    67.0 
boxplot(df_form2$edad, xlab = "", ylab = "Edad", main=NULL)
title("Gráfico 1. Edad")

Min. 1st Qu. Median Mean 3rd Qu. Max. 17.00 23.00 32.00 34.57 46.00 60.00

n = 310, sd = 12.619

Podemos así determinar el intervalo de confianza calculando:

desv/sqrt(n) = 12.619 /sqrt(310) =0.7167 z t alfa/2 = 1.96

U.Bound => 34.57 + 1.96 * 12.619 = 59.30 L.Bound => 34.57 - 1.96 * 12.619 = 9.84

Se sabe por tanto que la media real se puede encontrar en [9.84, 59.30] con 95% de certeza.

Género

df_form2 %>%
    group_by(genero) %>%
    summarise(n = n()) %>%
    barplot(n~genero, data=., xlab="Personas", ylab="Cantidad")

title("Gráfico 2. Género")

Ingreso promedio

par(mai = c(0.8, 1.5, 0.2, 0.5))
df_form2 %>%
    group_by(ingreso) %>%
    summarise(n = n()) %>%
    barplot(n~ingreso, data=., horiz = TRUE, las = 2, xlab = "Personas", ylab="")
title(ylab="Ingreso", line=6)
title("Gráfico 3. Ingresos")

Distrito

par(mai = c(1, 2, 0.5, 0.5))
#plot(edad~distrito, data = df_form2, horizontal=TRUE, las=2, xlab="")
#title(ylab="Distrito", line=8)

df_form2$distrito %>%
    table() %>%
    sort(TRUE) %>%
    barplot(horiz = TRUE, las = 2, xlab = "Personas", ylab="")
title("Gráfico 4. Distrito")

Empleo

par(mai = c(1, 1.5, 0.5, 0.5))
df_form2$empleo %>%
    table() %>%
    sort(TRUE) %>%
    barplot(horiz = TRUE, las = 2, xlab = "Personas", ylab="")

title("Gráfico 5. Tipo de trabajo")

¿Qué tanto varían las cifras de nuevos infectados durante los periodos de instauración previos-posteriores a la medida?

Para esta primera pregunta se han procesado los datos web. Se presentarán dos gráficos por cada una de las cuatro medidas que se analizarán. El primero de ellos será de los nuevos casos y el segundo de la movilización recreacional (cambios en la movilización). Los descriptores que se están utilizando para describir mejor los datos obtenidos es la media y mediana. Es necesario destacar que se ha optado por graficar los datos diez días antes de que se decrete la medida y diez días después de haberse promulgado. ## Declaración del Estado de Emergencia # Incorporar el n° de Gráfico 6. declaración nuevos casos

Nuevos casos 03-05 -> 03-25

plot_new_cases("2020-03-05", "2020-03-25")

.

En esta gráfica podemos visualizar que la cantidad de infectados por día bajó en algunos días inmediatamente después de que se declarará el estado de emergencia. Se puede apreciar en la gráfica que se lleva a cabo cada 2 o 3 días durante la semana siguiente a la implementación del Estado de Emergencia. Esto se podría deber a factores como la cantidad de pruebas tomadas por día, frecuencia de salida de las personas y el cumplimiento de las leyes y medidas tomadas.

Para analizar esta gráfica, se asume que el crecimiento de la enfermedad bajo condiciones normales es exponencial. Por tanto, se puede construir un modelo tal que: ln(y) At+B. Tomando a L1como regresión de control sin variable independiente y L2la regresión luego de aplicarse la medida, se realizó un F-test para comprobar si el modelo L1modela a L2 sin diferencias significativas.

-Ho : No existen diferencias significativas entre ambos modelos -Ha : Existen diferencias significativas entre el modelo anterior a la medida y el actual.

IMAGEN

Dado que la varianza 1 > varianza 2, la elección del orden de las variables es correcta. Por tanto, dado F > F crítico, se encuentra evidencia para falsear Ho. Dado > P(F<=f) una cola, se rechaza la hipótesis nula, por lo que existen diferencias significativas. Comparando las pendientes A1=0.337 y A2=0.0729 con A2 <A1, se puede asumir que se frenó la expansión de la enfermedad.

#ncorporar el n° de Gráfico 7. título misma medida pero la de cambio

PLOT

Movilización recreacional 03-05 -> 03-25

plot_rmoves("2020-03-05", "2020-03-25")

.

A partir del gráfico 7, se logra visualizar que previo a la promulgación de la medida “Declaración de Estado de Emergencia”, la gente tenía mucha más movilización y luego de decretada, el cambio de movilización disminuyó en gran medida. El promedio y mediana (líneas continuas) antes de que se aplique esta medida es aproximadamente -3. Por otro lado, el promedio y mediana (líneas punteadas) desde el quince hasta el veinticinco está por debajo de -60.

Para comprobar la significancia de esta diferencia, se realizó un test-t de medias. Se asumieron las siguientes hipótesis:

-Ho : No existe un efecto significativo de la medida por sobre las medias del Cambio de Movilización -Ha : Existen diferencias significativas entre las medias de la variable Cambio de Movilización para antes y después de ejecutarse la medida.

[imagen]

Dado que el valor |t| > t-crítico dos colas, se puede encontrar evidencia para rechazar la hipótesis nula Ho. Dado =0.05 > P(T<=t) dos colas, existe significancia suficiente para ello. Por tanto, se rechaza Ho, existiendo por tanto diferencias significativas entre antes de ejecutarse la declaración de Estado de Emergencia y después sobre la movilización de las personas. Debido a que el coeficiente de correlación es menor a 0, se puede afirmar que el cambio además redujo la movilización. ## Aprobación del Padrón de Hogares

Este gráfico nos muestra la cantidad de casos diez días antes y diez días después de que la medida “Aprobación del Padrón de Hogares” fuera aprobada. Esta es una gráfica muy importante, dado que tenía como objetivo ayudar a las poblaciones más vulnerables en condición de extrema pobreza a nivel nacional para que pudieran subsistir durante la cuarentena. Dicho en otras palabras, para que pudieran acceder a los servicios básicos y medicamentos, en caso fuesen requeridos. La cantidad de casos antes de que la medida fuese declarada, 08/03 hasta 18/03, va desde aproximadamente uno hasta veinte. No obstante, desde 18/03 hasta 28/03 la cantidad de casos va en aumento. Sin duda alguna, el objetivo era bueno, pero para el panorama que se estaba viviendo no fue efectiva. Una posible hipótesis sería la salida obligatoria de los beneficiarios a los bancos a formar largas colas durante horas. Esto explicaría el aumento de casos.

Nuevos casos 03-08 -> 03-28

plot_new_cases("2020-03-08", "2020-03-28")

.

#grafico 8 nuevos casos

Se realizó un f-test sobre los inputs a la regresión lineal del logaritmo de la gráfica, siguiendo el modelo planteado arriba. Se colocó como control a todos los datos previos a declararse la medida. Se plantearon las siguientes hipótesis: Ho : No existe un efecto significativo de la medida por sobre la tendencia de los nuevos casos con respecto al control. Ha : Existen un efecto significativo entre las muestras de control y la data posterior a la declaración.

IMAGEN

Dado que la primera varianza es mayor a la segunda, el orden de operación de los datos es correcto. Como tal, dado F > F-critico una cola, encontramos evidencia en contra de Ho. Dado ademas P(F<=f) < , se puede garantizar la decisión de rechazar la hipótesis nula, por lo que deben existir diferencias significativas entre los datos. Dado además A1= 0.2672 > A2=0.0116, se puede afirmar que la medida redujo la tasa de infección.

#GRAFICO 9 CAMBIOS

Esta gráfica, al igual que la Gráfica 7, manifiesta un comportamiento similar. Sin embargo, a partir de la disminución de la curva se podrían generar algunas conjeturas. La primera de ellas es que las personas tenían un respaldo para poder comprar sus alimentos y medicamentos de ser necesario por lo que ya no tenían que salir a las calles de manera concurrida a vender productos, entre otras cosas. Cabe resaltar que con esto no queremos decir que la población no salía y que la medida fue 100% efectiva. Al contrario, la población objetivo salió para hacer el retiro del subsidio por lo que el número de casos aumentó. Sin embargo, esto también contribuyó a que en días posteriores se queden en casa, debido a que contaban con dinero para subsistir por un par de semanas más (varía según el número de integrantes). Estas afirmaciones se respaldan con la media y mediana antes del decreto (líneas continuas), dado que se ubica en la parte superior del gráfico, mientras que la media y mediana (líneas punteadas) por debajo de -60.

#GRAFICO DE CAMBIOS RECREACIONALES Y ESO

Movilización recreacional 03-08 -> 03-28

plot_rmoves("2020-03-08", "2020-03-28")

.

Utilizando un test-t para medias en ambas secciones de la gráfica, podemos determinar si existe un efecto de la medida por sobre la trend general. Ho : No existen diferencias significativas entre ambas secciones de la gráfica. Ha : Existen diferencias significativas entre ambas secciones de la gráfica.

IMAGEN

Dado que el estadístico |t| > t-crítico dos colas, se encuentra evidencia para falsear la hipótesis nula. Dado que P(T<=t) < , la elección es justificable, por lo que se rechaza la hipótesis nula, concluyendo por tanto que existe una diferencia significativa entre ambas secciones de la gráfica. Debido a que la correlación es negativa, se concluye que la medida redujo

Salida alternada por género

El gráfico 10 exhibe la cantidad de casos antes y después de aplicarse la medida “Salida alternada por género”. En un primer momento esta medida tenía como objetivo disminuir el número de contagios. Por tal razón, el Gobierno decretó determinados días de salida para mujeres y otros para varones, y los domingos nadie salía. No obstante, a partir de la representación se puede observar que el número de casos aumentó de aproximadamente cien a mil cien casos. Después de los reportajes vistos, podríamos tratar de explicar este comportamiento basándonos en lo siguiente: las mamás consideran que los varones (esposos) no saben hacer las compras de mercado. Algunos dirían que esto no tiene fundamento, pero analizando detalladamente los reportajes, pudimos reconocer que en los días de salida de mujeres había mucha más aglomeración y desorden, a diferencia de los días en que les tocaba salir a los varones.

Nuevos casos 03-24 -> 04-13

plot_new_cases("2020-03-24", "2020-04-13")

.

#GRAFICO 10 NUEVOS CASOS

Para comprobar estadísticamente si es que la medida fue efectiva o no, se realizó el test F sobre la forma logarítmica de la regresión. Debido a que la regresión no se centra en 0, se normalizaron los puntos previamente.

Ho : No existe diferencias significativas entre los dos sets de puntos. Ha : Existe diferencias significativas entre el set de puntos antes y despues de aplicarse la medida.

IMAGEN

Dado que F < F-crítico una cola, no se puede falsear la hipótesis nula. Además, comoP(F<=f) una cola > 0.05, se decide mantener la hipótesis nula, considerando que no existen diferencias significativas. Con esto, se comprueba que la medida no tuvo éxito en reducir los nuevos casos.

#GRAFICO DE CAMBIOS

Movilización recreacional 03-24 -> 04-13

plot_rmoves("2020-03-24", "2020-04-13")

.

Se puede observar un leve cambio en la posición de las medias de ambos datasets. Para comprobar la significancia de esta diferencia, se plantea un test-t. Asumiendo:

Ho: No se puede encontrar diferencias significativas entre las dos fases.

Ha: Existen diferencias significativas entre antes de declararse la medida y tras su ejecución.

IMAGEN

Dado que |tStat| < t critico dos colas, no se puede encontrar evidencia que niegue Ho. Dado además que P(T<=t) > , no se llega a rechazar la hipótesis nula, por lo que se asume que no existen diferencias significativas tras la medida.

##Permiso de adquisición de bienes y servicios básicos

#grafico de nuevos casos

En el gráfico número 12 hay una observación muy poco evidente que se puede ver. Pocos días anteriores a la implementación de la medida en consideración, los nuevos casos empezaron a incrementar después de haberse mantenido relativamente constantes por un tiempo. El incremento de estos nuevos casos al parecer fue controlado por unos dias posteriores de ser tomada la medida. Sin embargo, en la gráfica se puede visualizar que aproximadamente una semana después de haberse tomado esta medida los casos empezaron a incrementar nuevamente.

Nuevos casos 04-10 -> 04-30

plot_new_cases("2020-04-10", "2020-04-30")

.

Para comprobar la significancia de esta diferencia, se plantea un test-f. Asumiendo a los puntos ubicados antes de la aplicación de la medida como control:

Ho: No se puede encontrar diferencias significativas entre la fase de control y tras aplicar la medida.

Ha: Existen diferencias significativas entre antes de declararse la medida y tras su ejecución.

IMAGEN

Dado F < F-crítico una cola, no se encuentra evidencia en contra de la hipótesis nula. Como P(F<=f)>0.05, no se rechaza Ho, asumiendo por tanto que no existen diferencias significativas en el ratio de aparición de nuevos casos.

#aqui va el grafico de cambios

Movilización recreacional 04-10 -> 04-30

plot_rmoves("2020-04-10", "2020-04-30")

.

En esta gráfica podemos ver que la medida de permiso de adquisición de bienes y servicios básicos no afectó de manera evidente la movilización social, ya que no se puede ver una reducción o incremento totalmente claro en los días posteriores a la implementación de esta medida. Se puede observar esto mediante un t-test. Asumiendo así:

Ho = No existe diferencia antes y después de aplicarse la medida

Ha = Existen diferencias significativas en la movilización entre el periodo previo a la declaración y el posterior.

IMAGEN

Dado que |t| < t-crítico, no se puede solventar la idea de rechazar la hipótesis directamente. Dado además que P(T<t) > , no se llega a rechazar completamente Ho, por lo que se asume que no existen diferencias significativas.

Frecuencia de salida

df_form2 %>%
    group_by(salidas) %>%
    summarise(n=n()) %>%
    barplot(n~salidas, data=., ylab = "Personas", xlab="Salidas")

title("Salidas por semana")

Casos por distrito

par(mai = c(1, 2.5, 1, 0.5))
df %>% filter(PROVINCIA == "LIMA") %>%
    select(DISTRITO) %>%
    table() %>%
    sort(TRUE) %>%
    barplot(las=1, horiz=TRUE, xlab="Casos")
title("Casos por distrito")

Razones

df_form2$razones %>% unlist() %>% table() -> razones_t 
wordcloud(names(razones_t), as.vector(razones_t), min.freq = 2)

title("Razones para salir durante la cuarentena")

Medidas

par(mai = c(1, 2.5, 0.5, 0.5))

(table(c(
    rep("Inmovilización",               length(which(df_form2$social.bool))),
    rep("No acceso a lugares públicos", length(which(df_form2$ocio.bool))),
    rep("Salida intercalada",           length(which(df_form2$noday.bool))),
    rep("Bono",                         length(which(df_form2$bono.bool))),
    rep("Un monto del Afp",             length(which(df_form2$afp1.bool))),
    rep("Un porcentaje del Afp",        length(which(df_form2$afp2.bool)))
))/length(df_form2$social.bool)) %>%
    sort(TRUE) %>%
    barplot(horiz = TRUE,
            las = 1,
            ylab = "",
            xlab = "Aprobación"
    )
title("Aprobación por medida (de 0 a 1)")

Inmovilización

df_form2$social.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("De 0 a 5, ¿Cúanto disminuyeron tus salidas durante la cuarentena?")

Suspensión de acceso a lugares públicos

df_form2$ocio.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("De 0 a 5, ¿Cúanto disminuyeron tus salidas durante la cuarentena?")

Disposición salida de hombres y mujeres en días complementarios

df_form2$noday.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("Del 0 al 5, ¿Cuánto cambió tus salidas?")

Multa de S/.86-S/.340 para todas las personas que desobedecen disposiciones del gobierno

df_form2$multa.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("De 0 a 5, ¿Cúanto disminuyeron tus salidas durante la cuarentena?")

Entrega de bono S/. 380, S/.760 de acuerdo al Sistema de Focalización de Hogares (SISFOH)

df_form2$bono.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("Del 0 al 5, ¿Cuánto se redujo tus salidas?")

Retiro de hasta S/. 2000 de fondos AFP de trabajadores afiliados que no tienen planilla

df_form2$afp1.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("Del 0 al 5, ¿ Cuán más te mantuviste en casa?")

Retiro del 25% de fondos AFP para trabajadores afiliados

df_form2$afp2.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?")

Distrito vs ingreso

# No supe como hacerlo con vanilla R
ggplot(aes(y = distrito, x = ingreso), data = df_form2) +
    geom_boxplot() +
    ggtitle("Distritos vs ingresos") +
    theme(plot.title = element_text(hjust = 0.5))

Distrito vs casos

par(mai = c(1, 2, 0.2, 0.5))
df %>% filter(PROVINCIA == "LIMA") %>%
    filter(DISTRITO %in% c("MIRAFLORES",
                           "BARRANCO",
                           "SAN ISIDRO",
                           "SANTIAGO DE SURCO",
                           "SAN BORJA")
           ) -> infectados_5 # Es necesario luego

infectados_5 %>%
    select(DISTRITO) %>%
    table() %>%
    sort(TRUE) %>%
    barplot(las=1, horiz=TRUE, xlab="Casos")
title("Casos en algunos distritos")

Distrito vs ingreso otra vez

df_form2 %>%
    filter(distrito %in% c("Miraflores",
                           "Barranco",
                           "San Isidro",
                           "Santiago de Surco",
                           "San Borja")
           ) -> df_5
ggplot(aes(y = distrito, x = ingreso), data = df_5) +
    geom_boxplot() +
    ggtitle("5 distritos vs ingresos") # Aún no ha respondido nadie de Miraflores.

Distrito vs empleo

ggplot(aes(y = distrito, x = empleo), data = df_5) +
    geom_boxplot() +
    ggtitle("5 distritos vs tipo de empleo")

Desaceleración del contagio

df_form2$decceleration %>%
    unlist() %>%
    table() %>%
    sort(TRUE) %>%
    knitr::kable(col.names = c("Medida", "Personas que lo aprueban"))
Medida Personas que lo aprueban
Toque de queda 204
Aplicación de medidas preventivas sanitarias 198
Inmovilización 192
Que la mayoría de la movilización es por vehículos particulares por suerte 15

Aceleración del contagio

df_form2$acceleration %>%
    unlist() %>%
    table() %>%
    sort(TRUE) %>%
    knitr::kable(col.names = c("Factor", "Personas que lo aprueban"))
Factor Personas que lo aprueban
Aglomeración de personas 176
Falta de educación 167
Informalidad 164
No acatar las medidas de prevención sanitaria 144
Desinformación 93
Sistema de salud 89
Fue una gestión adecuada en mi opinión 17
La alta densidad poblacional preexistente causa que no sirva de tanto el confinamiento ya que de todas maneras una casa en promedio alberga 10+ personas 15

Descriptores numéricos para las variables de mayor importancia:

Data web

  • Frecuencia de salida de personas (antes y después): Utilizamos mediana y media.
  • Cantidad de infectados por día: Utilizamos media.
  • Edad: Utilizamos la mediana para relacionar rangos de edades con las repuestas brindadas por las personas en las encuestas.

Encuestas

Se realizará una encuesta para aproximadamente 100 personas, en el cual se formularán preguntas con las siguientes variables: * Frecuencia de salida promedio al día antes del inicio de cuarentena * Frecuencia de salida promedio al día luego de la medida del gobierno * Cantidad aproximada de personas que observó en lugares públicos (mercado, hospital) luego de aplicadas las medidas del gobierno. Esto se medirá mediante un indicador categórico ordinal. * Cantidad de personas aproximada que observó cumplir con el distanciamiento social de 1 metro, luego de las medidas del gobierno. Esto se medirá mediante un indicador categórico ordinal * Tipo de trabajo (formal / informal) * Edad * Género * Distrito * Clase social * Nivel educativo

Descriptores gráficos

Utilizaremos:

Gráfica de dispersión para notar fácilmente como aumenta o decrece la cantidad de infectados e infectados por dia antes y después de que se aplique la medida. Además, la gráfica de dispersión nos puede ayudar a encontrar una relación y/o patrón entre la cantidad de infectados y/o movilización social y los días transcurridos desde que se empleó cada medida.

Obtención y Procesamiento de Resultados

Nuevos casos 03-05 -> 03-25

plot_new_cases("2020-03-05", "2020-03-25")

.

Movilización recreacional 03-05 -> 03-25

plot_rmoves("2020-03-05", "2020-03-25")

.

Nuevos casos 03-08 -> 03-28

plot_new_cases("2020-03-08", "2020-03-28")

.

Movilización recreacional 03-08 -> 03-28

plot_rmoves("2020-03-08", "2020-03-28")

.

Nuevos casos 03-24 -> 04-13

plot_new_cases("2020-03-24", "2020-04-13")

.

Movilización recreacional 03-24 -> 04-13

plot_rmoves("2020-03-24", "2020-04-13")

.

Nuevos casos 04-10 -> 04-30

plot_new_cases("2020-04-10", "2020-04-30")

.

Movilización recreacional 04-10 -> 04-30

plot_rmoves("2020-04-10", "2020-04-30")

.

Discusión de resultados

Patrones:

  • Pudimos notar que la curva de casos totales muestra un crecimiento continuo en el tiempo, evidenciándose un incremento de personas infectadas significativo entre antes y después de haber tomado cada medida.
  • En cuanto a los nuevos casos por día pudimos notar que todas las gráficas muestran una variación considerable en la cantidad de casos diarios pocos días después de que se aplicara cada medida. Estas variaciones se ven como datos atípicos en las gráficas.
  • En las gráficas de movilización social si se puede ver claramente el efecto de las medidas respectivas en ellas. El estado de emergencia hizo que la movilización social disminuyera en gran medida y la norma de salir días específicos de la semana también tuvo un impacto en la movilización ciertos días de la semana.

Bibliografía

LS0tCnRpdGxlOiAiRWZlY3RvIGRlIGxhcyBtZWRpZGFzIHRvbWFkYXMgcG9yIGVsIGdvYmllcm5vIHBlcnVhbm8gZnJlbnRlIGFsIENPVklELTE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBkYXJrbHkKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKPHN0eWxlPiBib2R5IHt0ZXh0LWFsaWduOiBqdXN0aWZ5fSA8L3N0eWxlPgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQojIE5vIG9sdmlkZXMgaW5zdGFsYXIgbGFzIGRlcGVuZGVuY2lhcwpsaWJyYXJ5KGJlcnJ5RnVuY3Rpb25zKQpsaWJyYXJ5KGN1cmwpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHdvcmRjbG91ZCkKCiMjIC0tLS0gY292aWQKdG1wIDwtIHRlbXBmaWxlKCkKY3VybF9kb3dubG9hZCgiaHR0cHM6Ly9jbG91ZC5taW5zYS5nb2IucGUvcy9ZOHczd0hzRWRZUVNaUnAvZG93bmxvYWQiLCB0bXApCgpyZWFkTGluZXModG1wKSAlPiUKICAgIGljb252KGZyb20gPSAiSVNPLTg4NTktMSIsIHRvID0gIlVURi04IikgJT4lCiAgICByZWFkX2NzdigpICU+JQogICAgbXV0YXRlKEZFQ0hBX1JFU1VMVEFETyA9IGx1YnJpZGF0ZTo6ZG15KEZFQ0hBX1JFU1VMVEFETykpIC0+IGRmCgojIyAtLS0tIG1vdmlsaXphdGlvbgp0bXAgPC0gdGVtcGZpbGUoKQpjdXJsX2Rvd25sb2FkKCJodHRwczovL3d3dy5nc3RhdGljLmNvbS9jb3ZpZDE5L21vYmlsaXR5L0dsb2JhbF9Nb2JpbGl0eV9SZXBvcnQuY3N2IiwgdG1wKQpyZWFkX2Nzdih0bXAsIGNvbF90eXBlcyA9ICJjY2NjY2REZGRkZGRkIikgJT4lCiAgICBmaWx0ZXIoY291bnRyeV9yZWdpb25fY29kZSA9PSAiUEUiKSAtPiBkZl9tb3YKCiMjIC0tLS0gaW5mZWMKZGYgJT4lCiAgICBncm91cF9ieShGRUNIQV9SRVNVTFRBRE8pICU+JQogICAgc3VtbWFyaXNlKE4gPSBuKCkpICU+JQogICAgYXJyYW5nZShGRUNIQV9SRVNVTFRBRE8pICU+JQogICAgbXV0YXRlKE5TVU0gPSBjdW1zdW0oTikpIC0+IGRmX2luZmVjCgojIyAtLS0tIHBsb3RfbmV3X2Nhc2VzCnBsb3RfbmV3X2Nhc2VzIDwtIGZ1bmN0aW9uKGRheSwgbWluX2RheSwgbWF4X2RheSwgbWFpbl90aXRsZSkgewogICAgZGZfaW5mZWMgJT4lCiAgICAgICAgZmlsdGVyKEZFQ0hBX1JFU1VMVEFETyA+PSBtaW5fZGF5ICYgRkVDSEFfUkVTVUxUQURPIDw9IG1heF9kYXkpIC0+IGRmX3RtcAoKICAgIGRmX2luZmVjICU+JQogICAgICAgIGZpbHRlcihGRUNIQV9SRVNVTFRBRE8gPj0gbWluX2RheSAmIEZFQ0hBX1JFU1VMVEFETyA8IGRheSkgLT4gZGZfdG1wX2EKCiAgICBkZl9pbmZlYyAlPiUKICAgICAgICBmaWx0ZXIoRkVDSEFfUkVTVUxUQURPID4gZGF5ICYgRkVDSEFfUkVTVUxUQURPIDw9IG1heF9kYXkpIC0+IGRmX3RtcF9iCgogICAgZGZfdG1wICU+JQogICAgICAgIHBsb3QoTn5GRUNIQV9SRVNVTFRBRE8sIGRhdGEgPSAuLCBtYWluID0gbWFpbl90aXRsZSwgeGxhYiA9ICJGZWNoYSIsIHlsYWIgPSAiTnVldm9zIGNhc29zIikKCiAgICBtZWFuMSA8LSBtZWFuKGRmX3RtcF9hJE4pCiAgICBzZWdtZW50cyhhcy5EYXRlKG1pbl9kYXkpLTEsIG1lYW4xLCBhcy5EYXRlKGRheSksIG1lYW4xLCBjb2wgPSAicmVkIikKICAgIAogICAgbWVkaWFuMSA8LSBtZWRpYW4oZGZfdG1wX2EkTikKICAgIHNlZ21lbnRzKGFzLkRhdGUobWluX2RheSktMSwgbWVkaWFuMSwgYXMuRGF0ZShkYXkpLCBtZWRpYW4xLCBjb2wgPSAiYmx1ZSIpCgogICAgbWVhbjIgPC0gbWVhbihkZl90bXBfYiROKQogICAgc2VnbWVudHMoYXMuRGF0ZShkYXkpLCBtZWFuMiwgYXMuRGF0ZShtYXhfZGF5KSsxLCBtZWFuMiwgY29sID0gInJlZCIsIGx0eSA9IDIpCiAgICAKICAgIG1lZGlhbjIgPC0gbWVkaWFuKGRmX3RtcF9iJE4pCiAgICBzZWdtZW50cyhhcy5EYXRlKGRheSksIG1lZGlhbjIsIGFzLkRhdGUobWF4X2RheSkrMSwgbWVkaWFuMiwgY29sID0gImJsdWUiLCBsdHkgPSAyKQoKICAgIGxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQ9YygiUHJvbWVkaW8gYW50ZXMiLCAiTWVkaWFuYSBhbnRlcyIsICJQcm9tZWRpbyBkZXNwdcOpcyIsICJNZWRpYW5hIGRlc3B1w6lzIiksCiAgICAgICBjb2w9YygicmVkIiwgImJsdWUiLCAicmVkIiwgImJsdWUiKSwgbHR5PWMoMSwxLDIsMiksIGNleD0wLjgpCn0KCiMjIC0tLS0gcGxvdF9zdW1fY2FzZXMKcGxvdF9zdW1fY2FzZXMgPC0gZnVuY3Rpb24oZGF5LCBtaW5fZGF5LCBtYXhfZGF5LCBtYWluX3RpdGxlKSB7CiAgICBkZl9pbmZlYyAlPiUKICAgICAgICBmaWx0ZXIoRkVDSEFfUkVTVUxUQURPID49IG1pbl9kYXkgJiBGRUNIQV9SRVNVTFRBRE8gPD0gbWF4X2RheSkgJT4lCiAgICAgICAgcGxvdChOU1VNfkZFQ0hBX1JFU1VMVEFETywgZGF0YSA9IC4sIG1haW4gPSBtYWluX3RpdGxlLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICJDYXNvcyB0b3RhbGVzIikKfQoKIyMgLS0tLSBwbG90X3Jtb3ZlcwpwbG90X3Jtb3ZlcyA8LSBmdW5jdGlvbihkYXksIG1pbl9kYXksIG1heF9kYXksIG1haW5fdGl0bGUpIHsKICAgIGRmX21vdiAlPiUKICAgICAgICBncm91cF9ieShkYXRlKSAlPiUKICAgICAgICBzdW1tYXJpc2UobW92ID0gbWVhbihyZXRhaWxfYW5kX3JlY3JlYXRpb25fcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSwgbmEucm0gPSBUUlVFKSkgLT4gZGZfdG1wCgogICAgZGZfdG1wICU+JSBmaWx0ZXIoZGF0ZSA+PSBtaW5fZGF5ICYgZGF0ZSA8IGRheSkgLT4gZGZfdG1wX2EKICAgIGRmX3RtcCAlPiUgZmlsdGVyKGRhdGUgPiBkYXkgJiBkYXRlIDw9IG1heF9kYXkpIC0+IGRmX3RtcF9iCiAgICBkZl90bXAgJT4lIGZpbHRlcihkYXRlID49IG1pbl9kYXkgJiBkYXRlIDw9IG1heF9kYXkpIC0+IGRmX3RtcAoKICAgIGRmX3RtcCAlPiUKICAgICAgICBwbG90KG1haW4gPSBtYWluX3RpdGxlLCB4bGFiID0gIkZlY2hhIiwgeWxhYiA9ICJDYW1iaW8gZGUgbW92aWxpemFjaW9uIikKCiAgICBtZWFuMSA8LSBtZWFuKGRmX3RtcF9hJG1vdikKICAgIHNlZ21lbnRzKGFzLkRhdGUobWluX2RheSktMSwgbWVhbjEsIGFzLkRhdGUoZGF5KSwgbWVhbjEsIGNvbCA9ICJyZWQiKQogICAgCiAgICBtZWRpYW4xIDwtIG1lZGlhbihkZl90bXBfYSRtb3YpCiAgICBzZWdtZW50cyhhcy5EYXRlKG1pbl9kYXkpLTEsIG1lZGlhbjEsIGFzLkRhdGUoZGF5KSwgbWVkaWFuMSwgY29sID0gImJsdWUiKQoKICAgIG1lYW4yIDwtIG1lYW4oZGZfdG1wX2IkbW92KQogICAgc2VnbWVudHMoYXMuRGF0ZShkYXkpLCBtZWFuMiwgYXMuRGF0ZShtYXhfZGF5KSsxLCBtZWFuMiwgY29sID0gInJlZCIsIGx0eSA9IDIpCiAgICAKICAgIG1lZGlhbjIgPC0gbWVkaWFuKGRmX3RtcF9iJG1vdikKICAgIHNlZ21lbnRzKGFzLkRhdGUoZGF5KSwgbWVkaWFuMiwgYXMuRGF0ZShtYXhfZGF5KSsxLCBtZWRpYW4yLCBjb2wgPSAiYmx1ZSIsIGx0eSA9IDIpCgogICAgbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZD1jKCJQcm9tZWRpbyBhbnRlcyIsICJNZWRpYW5hIGFudGVzIiwgIlByb21lZGlvIGRlc3B1w6lzIiwgIk1lZGlhbmEgZGVzcHXDqXMiKSwKICAgICAgIGNvbD1jKCJyZWQiLCAiYmx1ZSIsICJyZWQiLCAiYmx1ZSIpLCBsdHk9YygxLDEsMiwyKSwgY2V4PTAuOCkKfQoKIyMgLS0tLSBjYXRfZnVuY3Rpb24KY2F0X2Z1bmN0aW9uIDwtIGZ1bmN0aW9uKGZfbmFtZSwgbWluX2RheSwgbWF4X2RheSkgewogICAgY2F0KCJgYGB7cn1cbiIpCiAgICBjYXQoZl9uYW1lKQogICAgY2F0KCIoXCIiKQogICAgY2F0KGZvcm1hdChhcy5EYXRlKG1pbl9kYXkpLCAiJVktJW0tJWQiKSkKICAgIGNhdCgiXCIsIFwiIikKICAgIGNhdChmb3JtYXQoYXMuRGF0ZShtYXhfZGF5KSwgIiVZLSVtLSVkIikpCiAgICBjYXQoIlwiKVxuYGBgXG5cbiIpCn0KCiMjIC0tLS0gY2F0X3RpdGxlCmNhdF90aXRsZSA8LSBmdW5jdGlvbihmX3RpdGxlLCBtaW5fZGF5LCBtYXhfZGF5KSB7CiAgICBjYXQoIiMjIiwKICAgICAgICBmX3RpdGxlLAogICAgICAgIGZvcm1hdChhcy5EYXRlKG1pbl9kYXkpLCAiJW0tJWQiKSwKICAgICAgICAiLT4iLAogICAgICAgIGZvcm1hdChhcy5EYXRlKG1heF9kYXkpLCAiJW0tJWQiKSwKICAgICAgICAiXG4iCiAgICApCn0KCiMjIC0tLS0gY2F0X3Bsb3QKY2F0X3Bsb3QgPC0gZnVuY3Rpb24oZGF5LCByYW5nZSwgIG1haW5fdGl0bGUsIGZ1biwgdGl0bGUpIHsKICAgIG1pbl9kYXkgPC0gZGF5IC0gcmFuZ2UKICAgIG1heF9kYXkgPC0gZGF5ICsgcmFuZ2UKCiAgICBjYXRfdGl0bGUodGl0bGUsIG1pbl9kYXksIG1heF9kYXkpCiAgICBjYXRfZnVuY3Rpb24oYmVycnlGdW5jdGlvbnM6OmdldE5hbWUoZnVuKSwgbWluX2RheSwgbWF4X2RheSkKCiAgICAjIFByaW50IGRhdGUgaW4gdGl0bGUKICAgIGRhdGVfc3RyIDwtIHBhc3RlKCIoIixmb3JtYXQoYXMuRGF0ZShkYXkpLCAiJVktJW0tJWQiKSAsIikiLCBzZXA9IiIpCiAgICBmdW4oZGF5LCBtaW5fZGF5LCBtYXhfZGF5LCBwYXN0ZShtYWluX3RpdGxlLCBkYXRlX3N0cikpCiAgICBhYmxpbmUodiA9IGFzLkRhdGUoZGF5KSkKCiAgICBjYXQoIlxuLlxuXG5cbiIpCn0KCiMjIC0tLS0gcmVwZWF0X3Bsb3RzCnJlcGVhdF9wbG90cyA8LSBmdW5jdGlvbihkYXksIHJhbmdlLCBtYWluX3RpdGxlID0gIiIpIHsKICAgIGRheSA8LSBsdWJyaWRhdGU6OnltZChkYXkpCiAgICBjYXRfcGxvdChkYXksIHJhbmdlLCBtYWluX3RpdGxlLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCiAgICBjYXRfcGxvdChkYXksIHJhbmdlLCBtYWluX3RpdGxlLCBwbG90X3Jtb3ZlcywgIk1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsIikKfQpgYGAKClshW1IgQ0ldKGh0dHBzOi8vZ2l0aHViLmNvbS8yMDIwLTAxLWVzdC0xOS9wcm95ZWN0by93b3JrZmxvd3MvUiUyMENJL2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8yMDIwLTAxLWVzdC0xOS9wcm95ZWN0by9hY3Rpb25zP3F1ZXJ5PXdvcmtmbG93JTNBJTIyUitDSSUyMikKWyFbUHB0XShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL0lvc2xpZGVzLVBwdC1pbmZvcm1hdGlvbmFsP2xvZ289UildKC4vcHJlcy5odG1sKQpbIVtHaXRIdWIgZm9ya3NdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL2ZvcmtzLzIwMjAtMDEtZXN0LTE5L3Byb3llY3RvLnN2Zz9zdHlsZT1zb2NpYWwmbGFiZWw9Rm9yayZtYXhBZ2U9MjU5MjAwMCldKGh0dHBzOi8vZ2l0aHViLmNvbS8yMDIwLTAxLWVzdC0xOS9wcm95ZWN0bykKCiMgUHJvZmVzb3I6CiogSm9zZSBNaWd1ZWwgUmVub20KCiMgQ3Vyc286CiogRXN0YWTDrXN0aWNhIHkgUHJvYmFiaWxpZGFkZXMKCiMgSW50ZWdyYW50ZXMKKiBHw6luZXNpcyBGbG9yZXMgQXJyb3lvCiogQW5nZWwgU2FsdmFkb3IgQ2FsbGVqYSBDYXN0aWxsbwoqIEVzdGViYW4gVmlsbGFjb3J0YSBHYXJjaWEKKiBBbGJlcnRvIE9wb3J0byBBbWVzCiogUmljYXJkbyBBdHN1aGlrbyBZYW1hbW90byBZYW1hbW90bwoKIyBMw61kZXIKKiBHw6luZXNpcyBGbG9yZXMgQXJyb3lvCgojIEludHJvZHVjY2nDs24KRWwgQ09WSUQtMTkgaGEgdGVuaWRvIHVuIGdyYW4gaW1wYWN0byBhbHJlZGVkb3IgZGVsIG11bmRvIHkgaG95IGVuIGRpYSBlcyBmw6FjaWxtZW50ZQplbCB0ZW1hIGRlbCBxdWUgbcOhcyBzZSBoYWJsYS4KVG9kb3MgbG9zIHBhw61zZXMgaGFuIHRvbWFkbyBtZWRpZGFzIGNvbiByZXNwZWN0byBhIGVzdGEgcGFuZGVtaWEsCnNpbiBlbWJhcmdvIHVub3MgbGFzIGhhbiB0b21hZG8gbXV5IHRhcmRlIHkgZXN0byBzZSBoYSB2aXN0byBhZmVjdGFkbyBlbiBsYSBleHBhbnNpw7NuCmRlbCB2aXJ1cyBlbiBlbGxvcy4KRW4gUGVyw7osIGxhcyBtZWRpZGFzIHNlIGVtcGV6YXJvbiBhIHRvbWFyIHLDoXBpZGFtZW50ZSwKcGVybyB1bmEgY2FudGlkYWQgY29uc2lkZXJhYmxlIGRlIGxhIHBvYmxhY2nDs24gbm8gaGEgY3VtcGxpZG8gY29uIGxhcyBpbm1vdmlsaXphY2lvbmVzCnNvY2lhbGVzIHkgZXN0byBzZSBoYSB2aXN0byByZWZsZWphZG8gZW4gbGEgZXhwYW5zacOzbiBkZWwgdmlydXMgZW4gZWwgcGHDrXMuCsK/Q8OzbW8gcG9kZW1vcyBzYWJlciBjdcOhbGVzIGhhbiBzaWRvIGxhcyBtZWRpZGFzIG3DoXMgcmVzcGV0YWRhcyB5IHBvciBxdcOpPwpMYSByZXNwdWVzdGEgYSBlc3RhIHByZWd1bnRhIGxlIHNlcsOtYSBkZSBtdWNoYSBheXVkYSBhbCBnb2JpZXJubyBwZXJ1YW5vLAp5YSBxdWUgY29uIGVzdGEgaW5mb3JtYWNpw7NuIHNlIHBvZHLDrWEgc2FiZXIgcXVlIHRpcG8gZGUgbWVkaWRhcyBkZWJlcsOtYSB0b21hciB5IGVuIHF1w6kKbW9tZW50b3MgcGFyYSBxdWUgc2UgY3VtcGxhbiBkZSBtYW5lcmEgc2F0aXNmYWN0b3JpYS4KRXMgcG9yIGVsbG8gcXVlIG51ZXN0cm8gZ3J1cG8gaGEgZGVjaWRpZG8gaW52ZXN0aWdhciBhY2VyY2EgZGUgbGEgZWZlY3RpdmlkYWQgZGUgbGFzCm1lZGlkYXMgdG9tYWRhcyB5IHN1IHJlbGFjacOzbiBjb24gbGEgbW92aWxpemFjacOzbiBzb2NpYWwgZGUgbG9zIGNpdWRhZGFub3MuCgojIEZhY3RpYmlsaWRhZApFc3RlIHRyYWJham8gZXMgZmFjdGlibGUsIGRlYmlkbyBhIHF1ZSBsYSBtYXlvciBwYXJ0ZSBkZSBsYSBpbmZvcm1hY2nDs24gbGEgcG9kZW1vcwpjb25zZWd1aXIgZGUgZ3LDoWZpY29zIHlhIGV4aXN0ZW50ZXMgY29uIHJlbGFjacOzbiBhbCBDT1ZJRC0xOSBlbiBQZXLDuiB5IGxhIGluZm9ybWFjacOzbgpmYWx0YW50ZSBsYSBwb2RlbW9zIGFkcXVpcmlyIGEgdHJhdsOpcyBkZSBlbmN1ZXN0YXMuCkFkZW3DoXMsIGxvcyBlZmVjdG9zIGRlIGxhcyBtZWRpZGFzIHRvbWFkYXMgcG9yIGVsIGdvYmllcm5vIGVuIGxhIG1vdmlsaXphY2nDs24gc29jaWFsIHlhCnNlIHB1ZWRlbiBhbmFsaXphciwgZGViaWRvIGEgcXVlIHN1IGluZm9ybWFjacOzbiBzZSBvYnRpZW5lIHNvbGFtZW50ZSBkw61hcyBkZXNwdcOpcyBkZQppbXBsZW1lbnRhcmxhcy4KRmluYWxtZW50ZSwgZXN0YSBpbnZlc3RpZ2FjacOzbiBzZSBwdWVkZSBsbGV2YXIgYSBjYWJvIGVuIGVsIHRpZW1wbyBkYWRvLApkZWJpZG8gYSBxdWUgbm8gZXMgdW4gdHJhYmFqbyBxdWUgcmVxdWllcmEgdGllbXBvIGRlIGVzcGVyYSBwYXJhIGxsZWdhciBhIGNvbmNyZXRhcnNlLgpFc3RvIHF1aWVyZSBkZWNpciBxdWUgbG8gcG9kZW1vcyBlbXBlemFyIGlubWVkaWF0YW1lbnRlLgoKIyBPYmpldGl2b3MKTGEgaW1wb3J0YW5jaWEgZGUgZXN0ZSBlc3R1ZGlvIGVzdGFkw61zdGljbyByYWRpY2EgZW4gZWwgYW7DoWxpc2lzIGRlIGFsZ3VuYXMgZGUgbGFzCm1lZGlkYXMgcXVlIGVsIGdvYmllcm5vIGhhIGRlY2xhcmFkbyBhbnRlIGxhIGNveXVudHVyYSBkZWwgQ292aWQtMTkuCkVzIGltcG9ydGFudGUgZXN0dWRpYXIgc3UgZWZlY3RvIGVuIGxhIG1vdmlsaXphY2nDs24gc29jaWFsLApwdWVzdG8gcXVlIHBvZHLDrWEgb3RvcmdhciB1biBwYW5vcmFtYSBtw6FzIGhvbMOtc3RpY28geSB2ZXLDrWRpY28gc29icmUgbGFzIG1lZGlkYXMgcXVlCmdlbmVyYW4gdW4gaW1wYWN0byBwb3NpdGl2byBlbiBsYSBkZXNhY2VsZXJhY2nDs24gZGUgbGEgcHJvcGFnYWNpw7NuIGRlbApudWV2byB2aXJ1cyBTYXJzLUNvVi0yLgoKIyMgT2JqZWN0aXZvcyBnZW5lcmFsZXMKKiBFbCBvYmpldGl2byBkZSBlc3RlIHRyYWJham8gZXMgZGV0ZXJtaW5hciBlbiBxdcOpIG1lZGlkYSBsYXMgZGlmZXJlbnRlcyBhY2Npb25lcwpxdWUgaGEgYXBsaWNhZG8gZWwgZ29iaWVybm8sIGRlc2RlIGVsIGluaWNpbyBkZWwgcGVyaW9kbyBkZSBjdWFyZW50ZW5hIGhhc3RhIGVsCnRpZW1wbyBkZWwgZXN0dWRpbywgIHJlZHVqZXJvbiBlbCBpbXBhY3RvIHkgZXhwYW5zacOzbgpkZWwgQ292aWQtMTkgZW4gZWwgUGVyw7ouClF1ZXJlbW9zIGF2ZXJpZ3VhciBlbCBlZmVjdG8gZGUgZXN0YXMgbWVkaWRhcyBlbiAyIGRpZmVyZW50ZXMgYXNwZWN0b3MuCkVzdG9zIHNvbjogbGEgbW92aWxpemFjacOzbiBzb2NpYWwgeQpkZSBxdcOpIG1hbmVyYSBhZmVjdGFuIGxhIGN1cnZhIGRlIGF1bWVudG8gZGUgaW5mZWN0YWRvcyBwb3IgY29yb25hdmlydXMgZW4gUGVyw7ouCgojIyBPYmpldGl2b3MgZXNwZWPDrWZpY29zCiogRXN0YWJsZWNlciBsYXMgbWVkaWRhcyBhIGVzdHVkaWFyIHkgcXVlIGVzdGFzIHNlIGVuY3VlbnRyZW4gYWxpbmVhZGFzIGEKbGEgaW5tb3ZpbGl6YWNpw7NuIHNvY2lhbC4KKiBBbmFsaXphciBsYSBzaXR1YWNpw7NuIGRlIGxhIGNpdWRhZCBkZSBMaW1hIGVuIGVsIGNhc28gaGlwb3TDqXRpY28gZGUK4oCcRGVjbGFyYWNpw7NuIGRlIGVtZXJnZW5jaWEgZnVlcmEgZGUgdGllbXBv4oCdLgoqIEVzdGFibGVjZXIgbG9zIGZhY3RvcmVzIHF1ZSBkZXRlcm1pbmFuIGxhIHByZXN0YWNpw7NuIGRlIHNlcnZpY2lvcyBww7pibGljb3MgeQpzdSByZWxhY2nDs24gY29uIGxhIHByb3BhZ2FjacOzbiBkZWwgdmlydXMuCiogRXN0YWJsZWNlciB1bmEgcmVsYWNpw7NuIGVudHJlIGVsIGJvbm8gc3Vic2lkaW8geQplbCBkZXNhY2F0byBhIGxhIGlubW92aWxpemFjacOzbiBzb2NpYWwuCiogRXN0YWJsZWNlciBsYXMgcHJpbmNpcGFsZXMgcmF6b25lcyBkZSBsYXMgcGVyc29uYXMgcGFyYQpkZXNvYmVkZWNlciBsYSBpbm1vdmlsaXphY2nDs24gc29jaWFsLgoKIyBNYXJjbyBUZcOzcmljbwoKIyMgUG9ibGFjacOzbiBvYmpldGl2bwpMYSBwb2JsYWNpw7NuIGRlIGludGVyw6lzIHNvbiBsb3MgY2l1ZGFkYW5vcyBwZXJ1YW5vcy4KUGFyYSBsb2dyYXIgcXVlIG51ZXN0cmFzIHVuaWRhZGVzIG11ZXN0cmFsZXMgc2VhbiBsb3MgbcOhcyByZXByZXNlbnRhdGl2YSBwb3NpYmxlLApoZW1vcyBkZWNpZGlkbyBkZWxpbWl0YXIgbnVlc3RyYSBwb2JsYWNpw7NuIG9iamV0aXZvIGFsIMOhcmVhIGRlIExpbWEuCkVzdG8gc2UgZGViZSBhIHF1ZSBudWVzdHJvcyBlbmN1ZXN0YWRvcyBzZSBlbmN1ZW50cmFuIGVuIGVzdGEgem9uYSB5CmxhIG1heW9yIGNhbnRpZGFkIGRlIHBvYmxhY2nDs24gc2UgZW5jdWVudHJhIGFxdcOtLgoKIyMgVW5pZGFkIG11ZXN0cmFsCiogUGFyYSBsYXMgZW5jdWVzdGFzIG51ZXN0cmEgdW5pZGFkIG11ZXN0cmFsIHNvbiBsb3MgYWx1bW5vcyBkZSBsYSBVbml2ZXJzaWRhZCBVVEVDIHkgc3VzIGZhbWlsaWFzIFsxOCAtIDUwIGHDsW9zXQoqIENvbiByZXNwZWN0byBhIGxvcyBkYXRvcyB5IGdyw6FmaWNvcyBicmluZGFkb3MgcG9yIGxhIHdlYiwgbnVlc3RyYSB1bmlkYWQgbXVlc3RyYWwgZXMgbGEgY2l1ZGFkIGRlIExpbWEuCiogQWNjZWRlcmVtb3MgYSBsYXMgb2JzZXJ2YWNpb25lcyB5L28gbWVkaWNpb25lcyBkZSBsYXMgdW5pZGFkZXMgbXVlc3RyYWxlcyBtZWRpYW50ZQpmdWVudGVzIGRlIGludGVybmV0IHF1ZSBwcmVzZW50YW4gZmlhYmlsaWRhZCwgcmVzcGFsZG8gZGVsIGdvYmllcm5vLgpEZWwgbWlzbW8gbW9kbywgc2UgcmVhbGl6YXLDoW4gZW5jdWVzdGFzIGEgbG9zIGFsdW1ub3MgZGUgVVRFQyB5IHN1cyBmYW1pbGlhcmVzCmEgdHJhdsOpcyBkZSBwcmVndW50YXMgcmVsYWNpb25hZGFzIGNvbiBzdSBtb3ZpbGl6YWNpw7NuIHNvY2lhbCBhbnRlcyB5IGR1cmFudGUgbGEKY3VhcmVudGVuYS4KRWxsbyBjb24gZWwgcHJvcMOzc2l0byBkZSBlbmNvbnRyYXIgbGFzIHJhem9uZXMgZGUgbW92aWxpemFjacOzbgoKIyMgTXVlc3RyZW8KVGlwbyBkZSBtdWVzdHJlbwoKRWwgdGlwbyBkZSBtdWVzdHJlbyBlcyBhbGVhdG9yaW8gc2ltcGxlIGVzdHJhdGlmaWNhZG8gcGFyYSBjaXVkYWRhbm9zIGNvbiBlZGFkZXMKZW50cmUgMTgtNTAgYcOxb3MuCkVsbG8sIGRhZG8gcXVlIHRvZG9zIGxvcyBpbmRpdmlkdW9zIGRlIHN1YmNvbmp1bnRvIGRlIGxhIHBvYmxhY2nDs24gb2JqZXRpdm8KdGllbmVuIGxhIG1pc21hIHByb2JhYmlsaWRhZCBkZSBzZXIgc2VsZWNjaW9uYWRvcy4KCiMjIFRhbWHDsW8gZGUgbGEgbXVlc3RyYQoqIFBhcmEgbGEgaW52ZXN0aWdhY2nDs24sIHNlIGJ1c2NhIGN1bXBsaXIgcG9yIGxvIG1lbm9zIGNvbjoKPDAuMDUsIGU8MC4wNQoqUGFyYSBlbmNvbnRyYXIgdW4gbsO6bWVybyBtw61uaW1vIGRlIHBlcnNvbmFzIGEgZW50cmV2aXN0YXIsIG1hbnRlbmllbmRvIHVuYSBjb25maWFuemEgZGUgOTUlIHkgbWFyZ2VuIGRlIGVycm9yIGRlIDUlLCBzZSB1dGlsaXrDsyBsYSBzaWd1aWVudGUgZsOzcm11bGE6CgokJG4gPSBaXjJwKDEtcCkvZV4yJCQKCkNvbW8gbm8gaGF5IHRvZGF2w61hIGRhdG9zIHBhcmEgb2J0ZW5lciBlbCB2YWxvciByZWFsIGRlIHAsIHNlIGFzdW1lIHAgPSAwLjUuIENvbiBlbGxvLCBzZSBvYnRpZW5lIHVuIHRhbWHDsW8gZGUgbXVlc3RyYSBkZSBwb3IgbG8gbWVub3MgOTEgcGVyc29uYXMgcGFyYSBzZXIgc2lnbmlmaWNhdGl2by4gCgojIFByb3ZlbmllbmNpYSBkZSBsb3MgZGF0b3MKRXhpc3RlbiB2YXJpYXMgZnVlbnRlcyBkZSBsYSBxdWUgZXMgcG9zaWJsZSBleHRyYWVyIGxhIGluZm9ybWFjacOzbiBuZWNlc2FyaWEKcGFyYSByZXNwb25kZXIgbGFzIHByZWd1bnRhcy4KCiogQ29tcGVuZGlvIGRlIG5vcm1hcyBlbWl0aWRhcyBwb3IgZWwgRXN0YWRvIFBlcnVhbm8gcGFyYSBhZnJvbnRhciBsYSBwcm9wYWdhY2nDs24KICBkZWwgQ292aWQtMTkuICgxIGRlIGZlYnJlcm8gZGUgMjAyMCBhbCA3IGRlIG1heW8gZGUgMjAyMCkKKiBOb3JtYXRpdmEgc29icmUgRXN0YWRvIGRlIEVtZXJnZW5jaWEgcG9yIENvcm9uYXZpcnVzLgoqIEFjY2lvbmVzIGFkb3B0YWRhcyBwb3IgZWwgZ29iaWVybm8gYW50ZSBDT1ZJRC0xOSAoMjAyMCkKKiBDT1ZJRC0xOSBDb21tdW5pdHkgTW9iaWxpdHkgUmVwb3J0ICgyMDIwKS4KCipOb3RhOiBUb2RhcyBzZSBlbmN1ZW50cmFuIGNpdGFkYXMgZW4gYmlibGlvZ3JhZsOtYS4qCgpMYSBpbmZvcm1hY2nDs24gY29udGVuaWRhIGVuIGVzdGFzIGRpcmVjY2lvbmVzIHNvbiBvcmlnaW5hbGVzLAphZGVtw6FzIGRlIGNvbmZpYWJsZXMsIGRhZG8gcXVlIHNlIHByZXNlbnRhIGNhZGEgbWVkaWRhIGNvbiBzdSByZXNwZWN0aXZvIGRlY3JldG8KbGVnaXNsYXRpdm8uCkFzaW1pc21vLCBsb3MgZGF0b3MgZXN0YWTDrXN0aWNvcyBjdWVudGFuIGNvbiBzdXN0ZW50byBkZSBmdWVudGVzIG9maWNpYWxlcy4KCiMgVXNvIGRlIGRhdG9zCgpDb24gcmVzcGVjdG8gYWwgdXNvIGRlIGxvcyBkYXRvcyBvYnRlbmlkb3MgZGUgZnVlbnRlcywgdGVuZW1vcyBjbGFybyBjw7NtbyB1dGlsaXphciBjYWRhIHVubyBkZSBlbGxvcy4KTGEgZnVlbnRlIGRlIGxhIHF1ZSBhZHF1aXJpbW9zIGxhIGluZm9ybWFjacOzbiByZXNwZWN0byBhIGxhcyBtZWRpZGFzIHRvbWFkYXMgbm9zIGVzIGRlCm11Y2hhIGF5dWRhLCB5YSBxdWUganVudG8gYSBlbGxhcyBlc3TDoW4gbGFzIGZlY2hhcyBlbiBsYXMgcXVlIHNlIGxsZXZhcm9uIGEgY2Fiby4KRXN0byBub3MgcGVybWl0ZSBhbmFsaXphciBsYSBwb2JsYWNpw7NuIGFudGVzIHkgZGVzcHXDqXMgZGUgcXVlIHNlIGltcGxlbWVudGFyw6FuCmVzdGFzIG1lZGlkYXMuCgpMYXMgZnVlbnRlcyBkZSBsYXMgcXVlIGFkcXVpcmltb3MgbGFzIGdyw6FmaWNhcyBkZSBpbm1vdmlsaXphY2nDs24gc29jaWFsIHRhbWJpw6luIG5vcwpzb24gZGUgZ3JhbiBheXVkYSBwb3JxdWUgbm9zIHBlcm1pdGVuIHJlbGFjaW9uYXIgbGFzIGZlY2hhcyBlbiBsYXMgcXVlIHNlIGxsZXZhcm9uCmEgY2FibyBsYXMgbWVkaWRhcyBndWJlcm5hbWVudGFsZXMgY29uIGVsIGZsdWpvIGRlIGdlbnRlIGVuIGxhcyBjYWxsZXMuCkVzdGEgcmVsYWNpw7NuIGVzIG11eSBpbXBvcnRhbnRlLCB5YSBxdWUgbm9zIHBlcm1pdGlyw6EgYW5hbGl6YXIgbGEgZWZlY3RpdmlkYWQgZGUKbG9zIGRlY3JldG9zIHkgbm9zIGF5dWRhcsOhIGEgbG9ncmFyIG51ZXN0cm9zIG9iamV0aXZvcy4KRWwgcHJvY2VzYW1pZW50byBkZSBsYSBkYXRhIG9idGVuaWRhIGVuIGxhcyBmdWVudGVzIGVzIG11eSBpbXBvcnRhbnRlLApkZWJpZG8gYSBxdWUgcG9yIHPDrSBzb2xhcyBub3MgbXVlc3RyYW4gaW5mb3JtYWNpw7NuIOKAnGNydWRh4oCdIHF1ZSB0b2RvIGVsIG11bmRvIHlhIGNvbm9jZS4KQWwgcHJvY2VzYXIgZXN0YSBkYXRhIHkgcmVsYWNpb25hcmxhIGNvbiBvdHJhL3MsIGxhIGludmVzdGlnYWNpw7NuIHNlIHZ1ZWx2ZSBtw6FzCmludGVyZXNhbnRlLCB5YSBxdWUgbGFzIHJlbGFjaW9uZXMgZW50cmUgZGlmZXJlbnRlcyBlc3RhZMOtc3RpY2FzIHNvbgpwb3NpYmxlbWVudGUgZGVzY29ub2NpZGFzIHkgbGUgYnJpbmRhbiBpbmZvcm1hY2nDs24gbXVjaG8gbcOhcyDDunRpbCBhbCBsZWN0b3IuCgojIFBsYW5pZmljYWNpw7NuCgo8aW1nIHNyYz0iZ2FudHQuc3ZnIj4KCiMgTWVkaWRhcyBlbGVnaWRhcwoKMS4gRGVjcmV0byBkZSBlc3RhZG8gZGUgZW1lcmdlbmNpYS4KICAgIC0gwr9DdcOhbCBmdWUgZWwgZWZlY3RvIHF1ZSB0dXZvIGVsIGRlY3JldG8gZGUgZXN0YWRvIGRlIGVtZXJnZW5jaWEgZW4KICAgIGxhIHBvYmxhY2nDs24gZW1vY2lvbmFsbWVudGU/IChFeHBsb3JhdG9yaWEpCgoyLiBEZWNyZXRvIGRlIFVyZ2VuY2lhIHF1ZSBkaWN0YSBtZWRpZGFzIGV4dHJhb3JkaW5hcmlhcyBjb24gbGEgZmluYWxpZGFkIGRlCmFkcXVpcmlyIGJpZW5lcyB5IHNlcnZpY2lvcyBuZWNlc2FyaW9zIHBhcmEgZWwgYWxvamFtaWVudG8gZW4gY3VhcmVudGVuYSB5CmFsaW1lbnRhY2nDs24gZGUgbGFzIHBlcnNvbmFzIHF1ZSBkZWJhbiBkZXNwbGF6YXJzZSBkZW50cm8gZGVsIHBhw61zIGEKY29uc2VjdWVuY2lhIGRlIGxhIGRlY2xhcmFjacOzbiBkZWwgRXN0YWRvIGRlIEVtZXJnZW5jaWEgTmFjaW9uYWwgcG9yIGVsIENPVklELTE5ICgzODApCiAgICAtIMK/TGEgY2FudGlkYWQgZGUgcGVyc29uYXMgcXVlIHNlIHZpZXJvbiBiZW5lZmljaWFkYXMgcG9yIGVzdGUgZGVjcmV0byBmdWUKICAgIHN1ZmljaWVudGUgcGFyYSBxdWUgc2UgcmVkdXpjYSBjb25zaWRlcmFibGVtZW50ZSBlbCB0csOhbnNpdG8gZGUgZ2VudGU/IChJbmZlcmVuY2lhbCkKCjMuIEFwcnVlYmFuIGVsIFBhZHLDs24gZGUgbG9zIGhvZ2FyZXMgZW4gY29uZGljacOzbiBkZSBwb2JyZXphIG8gcG9icmV6YSBleHRyZW1hCmJlbmVmaWNpYXJpb3MgZGVsIHN1YnNpZGlvIG1vbmV0YXJpbyBkZSBhY3VlcmRvIGFsIFNpc3RlbWEgZGUgRm9jYWxpemFjacOzbiBkZQpIb2dhcmVzIChTSVNGT0gpIHF1ZSBzZSBlbmN1ZW50cmVuIGVuIGxvcyDDoW1iaXRvcyBnZW9ncsOhZmljb3MgY29uIG1heW9yCnZ1bG5lcmFiaWxpZGFkIHNhbml0YXJpYSBlbiBlbCBtYXJjbyBkZWwgRC5VLiBOwrAgMDI3LTIwMjAgKDY4KQogICAgLSDCv0xhIHRhc2EgZGUgcGVyc29uYXMgcXVlIHJlY2liZW4gbGEgYm9uaWZpY2FjacOzbiBwb3IgZMOtYSBmdWUgYWxjYW56YWJsZSBhIGxhCiAgICBtYXlvcsOtYSBkZSBwZXJzb25hcyBkZWwgc2VjdG9yIHZ1bG5lcmFibGU/IChEZXNjcmlwdGl2YSkKCjQuIERpc3Bvc2ljacOzbiBwcmVzaWRlbmNpYWwgcXVlIHBlcm1pdGUgbGEgc2FsaWRhIGRlIGhvbWJyZXMgeSBtdWplcmVzIGVuIGTDrWFzCmNvbXBsZW1lbnRhcmlvcyAobHVuZXMtbWnDqXJjb2xlcy12aWVybmVzIC8gbWFydGVzLWp1ZXZlcy1zw6FiYWRvcykKICAgIC0gwr9RdcOpIGRpZmVyZW5jaWEgaHVibyBlbiBlbCB0csOhbnNpdG8gZGUgcGVyc29uYXMgZW50cmUgbG9zIGTDrWFzIHBhcmEgaG9tYnJlcyB5CiAgICBwYXJhIG11amVyZXM/IChEZXNjcmlwdGl2YSkKICAgIC0gwr9BIGTDs25kZSBzZSBkaXJpZ2UgbGEgbWF5b3IgcGFydGUgZGVsIGZsdWpvIGRlIHBlcnNvbmFzPyDCv1F1w6kgcmF6w7NuIGV4cGxpY2Fyw61hIGVzdG8/IChFeHBsb3JhdG9yaWEpCgojIyAgUHJlZ3VudGFzIHByb3B1ZXN0YXMgcGFyYSBlc3R1ZGlvIChwYXJhIGxvcyBlbmN1ZXN0YWRvcykKCnxOwrAgfCBQcmVndW50YSB8IFRpcG8gfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8MSAgfMK/UXXDqSBlZGFkIHRpZW5lbiBsb3MgbWllbWJyb3MgZGUgbGEgbXVlc3RyYT98IERlc2NyaXB0aXZhfAp8MiAgfMK/RGUgcXXDqSBnw6luZXJvIHNvbj98IERlc2NyaXB0aXZhfAp8MyAgfMK/Q3XDoW50byBlcyBzdSBpbmdyZXNvIHByb21lZGlvP3wgRGVzY3JpcHRpdmF8Cnw0ICB8wr9FbiBxdcOpIGRpc3RyaXRvIHZpdmVzP3wgRGVzY3JpcHRpdmF8Cnw1ICB8wr9DdcOhbCBmdWUgZWwgw7psdGltbyBuaXZlbCBlZHVjYXRpdm8gcXVlIGNvbXBsZXRhc3RlP3wgRGVzY3JpcHRpdmF8Cnw2ICB8wr9TdSB0aXBvIGRlIGVtcGxlbyBlcyBmb3JtYWwgbyBpbmZvcm1hbD98IERlc2NyaXB0aXZhfAp8NyAgfMK/UXXDqSB0YW4gZnJlY3VlbnRlbWVudGUgc2Fsw61hIGRlIGNhc2EgcHJldmlhbWVudGUgYWwgY29taWVuem8gZGUgbGEgY3VhcmVudGVuYT98IERlc2NyaXB0aXZhfAp8OCAgfMK/UXXDqSB0YW50byBjb25zaWRlcmFzIHF1ZSB0dSBkaXN0cml0byBzZSBoYSB2aXN0byBhZmVjdGFkbyBwb3IgbGEgZW5mZXJtZWRhZD98IERlc2NyaXB0aXZhfAp8OSAgfMK/UG9yIHF1w6kgcmF6b25lcyBzYWzDrWFzIGR1cmFudGUgbGEgY3VhcmVudGVuYT98IERlc2NyaXB0aXZhfAp8MTAgIHzCv0NvbnNpZGVyYXMgcXVlIGVzdGEgbWVkaWRhIOKAnGMvdSBkZSBsYXMgbWVkaWRhc+KAnSBmdWUgZWZlY3RpdmEgcGFyYSByZWR1Y2lyIGVsIG7Dum1lcm8gZGUgY29udGFnaW9zIGVuIHR1IGRpc3RyaXRvP3wgRGVzY3JpcHRpdmF8CnwxMXzCv1F1w6kgY29uZGljaW9uZXMgY3JlZXMgcXVlIGFjZWxlcmFuIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQgZW4gdHUgZGlzdHJpdG8/fCBEZXNjcmlwdGl2YXwKfDEyIHzCv1F1w6kgY29uZGljaW9uZXMgY3JlZXMgcXVlIHJldGFyZGFuIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQgZW4gdHUgZGlzdHJpdG8/fCBEZXNjcmlwdGl2YXwKfDEzIHzCv1F1w6kgbWVkaWRhcyBndWJlcm5hbWVudGFsZXMgc29uIGxhcyBxdWUgcmVjdWVyZGFzIHF1ZSBzZSBoYXlhbiB0b21hZG8/fCBEZXNjcmlwdGl2YXwKCgojIyAgUHJlZ3VudGFzIHByb3B1ZXN0YXMgcGFyYSBlc3R1ZGlvIChwYXJhIGxhIGRhdGEpCgoKfE7CsCB8IFByZWd1bnRhIHwgVGlwbyB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnwxNCAgfMK/UXXDqSB0YW50byB2YXLDrWFuIGxhcyBjaWZyYXMgZGUgbnVldm9zIGluZmVjdGFkb3MgZHVyYW50ZSBsb3MgcGVyaW9kb3MgZGUgaW5zdGF1cmFjacOzbiBwcmV2aW9zLXBvc3RlcmlvcmVzIGEgbGEgbWVkaWRhP3wgRGVzY3JpcHRpdmF8CnwxNSAgfMK/Q3XDoWxlcyBlcmFuIGxhcyByYXpvbmVzIHBvciBsYXMgcXVlIGxhIHBvYmxhY2nDs24gc2Fsw61hIGR1cmFudGUgbGEgY3VhcmVudGVuYT98IERlc2NyaXB0aXZhfAp8MTYgIHzCv0N1w6FsZXMgaGFuIHNpZG8gbGFzIG1lZGlkYXMgcXVlIGhhbiB0ZW5pZG8gbWF5b3IgaW1wYWN0byBlbiBsYSBwb2JsYWNpw7NuP3wgRGVzY3JpcHRpdmF8CnwxNyAgfEV4aXN0ZSB1bmEgbWlzbWEgdGVuZGVuY2lhIGRlIHBvYmxhY2lvbmVzIGFmZWN0YWRhcyBwb3IgZWwgQ292aWQgMTkgZHVyYW50ZSBsYXMgbWVkaWRhcyBkZSBhaXNsYW1pZW50bz8gfCBFeHBsb3JhdG9yaWF8CnwxOCAgfMK/TGFzIG1lZGlkYXMgZW4gbG9zIGRpc3RyaXRvcyBtw6FzIGV4Y2x1c2l2b3MgcHJlc2VudGFuIHVuYSBtYXlvciBvIG1lbm9yIGVmZWN0aXZpZGFkP3wgRXhwbG9yYXRvcmlhfAp8MTkgIHzCv0xhIGVudHJlZ2EgZGUgbWF5b3JlcyBzdWJzaWRpb3MgbW9uZXRhcmlvcyByZXN1bHRhcsOtYSBlbiB1biBpbXBvcnRhbnRlIGJlbmVmaWNpbyBwYXJhIGxhIGRpc21pbnVjacOzbiBkZWwgbsO6bWVybyBkZSBzYWxpZGFzP3wgSW5mZXJlbmNpYWx8CnwyMCAgfMK/RXMgcG9zaWJsZSBwcmVkZWNpciBjdcOhbnRhcyBob3JhcyBlbiBwcm9tZWRpbyB1bmEgcGVyc29uYSBzYWzDrWEgZGUgY2FzYSBjb25vY2llbmRvIHN1IG5pdmVsIGRlIGluZ3Jlc29zIHkgZWwgZGlzdHJpdG8gZGUgcmVzaWRlbmNpYT98IFByZWRpY3RpdmF8CnwyMSAgfMK/RXMgcG9zaWJsZSBwcmVkZWNpciBzdSBuaXZlbCBkZSBpbmdyZXNvcyBjb25vY2llbmRvIMO6bmljYW1lbnRlIHN1IHRpcG8gZGUgZW1wbGVvP3wgUHJlZGljdGl2YXwKfDIyICB8wr9RdcOpIGZhY3RvcmVzIGRldGVybWluYW4gcXVlIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQgMTkgc2UgZGVzYWNlbGVyZT98IENhdXNhbHwKfDIzICB8wr9Dw7NtbyBjaWVydGFzIGNvbmRpY2lvbmVzIGRldGVybWluYW4gcXVlIGxhIHByb3BhZ2FjacOzbiBkZWwgQ09WSUQgc2UgYWNlbGVyZSAvIHJldGFyZGU/fCBNZWNhbsOtc3RpY2F8CgojIFZhcmlhYmxlcwoKfFZhcmlhYmxlfCBSZWxhY2nDs24gY29uIHByZWd1bnRhfCBUaXBvIGRlIHZhcmlhYmxlfAp8LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18CnxFZGFkfCAxfCBDdWFudGl0YXRpdmEgZGlzY3JldGF8CnxHw6luZXJvfCAyfCBDdWFsaXRhdGl2YSBub21pbmFsfAp8Q2xhc2Ugc29jaWFsfCAzLDE3LDE4LDIwLDIxfCBDdWFsaXRhdGl2YSBvcmRpbmFsfAp8Tml2ZWwgZWR1Y2F0aXZvIGFsY2FuemFkb3wgNSwxNywxOHwgQ3VhbGl0YXRpdmEgb3JkaW5hbHwKfFRpcG8gZGUgdHJhYmFqb3wgNiwxOCwyMXwgQ3VhbGl0YXRpdmEgbm9taW5hbHwKfEZyZWN1ZW5jaWEgZGUgc2FsaWRhIHwgNywxOCwxOXwgQ3VhbnRpdGF0aXZhIGRpc2NyZXRhfAp8THVnYXIgZG9uZGUgdml2ZSAoZGlzdHJpdG8pfCA0LDE3LDE4LDIwfCBDdWFsaXRhdGl2YSBub21pbmFsfAp8Q2FudGlkYWQgZGUgaW5mZWN0YWRvcyBwb3IgZGlhfCAxNCwxOXwgQ3VhbnRpdGF0aXZhIGRpc2NyZXRhfAp8SnVzdGlmaWNhY2lvbiBkZSBzYWxpZGF8IDksMTV8IEN1YWxpdGF0aXZhIG5vbWlsYWx8CnxNZWRpZGFzIGFwbGljYWRhc3wgMTAsMTYsMTcsMTgsMTl8IEN1YWxpdGF0aXZhIG5vbWluYWx8CnxGYWN0b3Jlc3wgMjIsMjN8IEN1YWxpdGF0aXZhIG5vbWluYWx8CgojRGVzY3JpcHRvcmVzIG51bcOpcmljb3MgcGFyYSBsYXMgdmFyaWFibGVzIGRlIG1heW9yIGltcG9ydGFuY2lhOgoKIyNWYXJpYWJsZXMgRGF0YSB3ZWIKCi1DYW50aWRhZCAgZGUgIHBlcnNvbmFzIHF1ZSBzZSBtb3ZpbGl6YW4gZW4gbGFzIGNhbGxlcyBhbnRlcyB5IGRlc3B1w6lzIGRlIGNhZGEgdW5hIGRlIGxhcyBtZWRpZGFzLCBUaWVtcG8sIE1lZGlkYXMgYXBsaWNhZGFzOgoKKk1lZGlhICh2YWxvcik6IHBlcm1pdGlyw6EgIGNvbm9jZXIgZW4gcHJvbWVkaW8gY3XDoW50b3MgIGNpdWRhZGFub3MgbGltZcOxb3Mgc2UgbW92aWxpemFuICBhbnRlcyB5IGRlc3B1w6lzIGRlIGxhIG1lZGlkYQoKKk1lZGlhbmEsIGN1YXJ0aWxlcyAodmFsb3IpOiBwZXJtaXRpcsOhIHNhYmVyIGN1w6FudG9zIGNpdWRhZGFub3MgbGltZcOxb3Mgc2UgbW92aWxpemFuIGFsIDI1JSwgNTAlOyA3NSUsIDEwMCUgIGRlbCB0aWVtcG8gZGUgZXN0dWRpbywgZGUgZXN0YSBtYW5lcmEgc2UgY29ub2NlcsOhICBlbCBlZmVjdG8gZGUgbGEgbW92aWxpemFjacOzbiBjb24gZWwgdHJhbnNjdXJzbyBkZWwgdGllbXBvIHBhcmEgY2FkYSBtZWRpZGEuCgoqRGVzdmlhY2nDs24gZXN0w6FuZGFyOiBwZXJtaXRpcsOhIHNhYmVyIGN1w6FudGFzIHNvbiBsYXMgdmFyaWFjaW9uZXMgcHJvbWVkaW8gIGRlIG1vdmlsaXphY2nDs24gc29jaWFsIHJlc3BlY3RvIGEgbGEgbWVkaWEgIAoKLUNhbnRpZGFkIGRlIGluZmVjdGFkb3MgcG9yIGTDrWEsIFRpZW1wbzoKCipNZWRpYSh2YWxvcik6IHBlcm1pdGlyw6EgY29ub2NlciBjdcOhbnRvIGVzIGxhIHRhc2EgaW5mZWN0YWRvcyBxdWUgIGh1Ym8gZW4gcHJvbWVkaW8gYW50ZXMgeSBkZXNwdcOpcyBkZSBtZWRpZGEgYXBsaWNhZGEKCipNZWRpYW5hLCBjdWFydGlsZXMgKHZhbG9yKTogcGVybWl0aXLDoSBzYWJlciBjdcOhbnRvcyBpbmZlY3RhZG9zIGh1Ym8gYWwgMjUlLCA1MCU7NzUlLCAxMDAlICBkZWwgdGllbXBvIGRlIGVzdHVkaW8sIGRlIGVzdGEgbWFuZXJhIHNlIGNvbm9jZXLDoSAgZWwgZWZlY3RvIGRlbCBuw7ptZXJvIGRlIGluZmVjdGFkb3MgY29uIGVsIHRyYW5zY3Vyc28gZGVsIHRpZW1wbyBwYXJhIGNhZGEgbWVkaWRhLgoKKkRlc3ZpYWNpw7NuIGVzdMOhbmRhcjogcGVybWl0aXLDoSBzYWJlciBjdcOhbnRhcyBzb24gbGFzIHZhcmlhY2lvbmVzIHByb21lZGlvIGRlIGluZmVjdGFkb3MgcmVzcGVjdG8gYSBsYSBtZWRpYS4KCiNWYXJpYWJsZXMgRW5jdWVzdGFzCgotRnJlY3VlbmNpYSBkZSBzYWxpZGEgcHJvbWVkaW8gYSBsYSBzZW1hbmEgLGFudGVzIHkgZGVzcHXDqXMgZGUgY2FkYSBtZWRpZGEgZGVsIGdvYmllcm5vCgpNZWRpYW5hLCBjdWFydGlsZXMgKHZhbG9yKTogcGVybWl0aXLDoSBzYWJlciBjdcOhbnRhcyBzYWxpZGFzIGEgbGEgc2VtYW5hIHJlcHJlc2VudGEgMjUlLDUwJSw3NSUgZGUgbG9zIGNpdWRhZGFub3MgZGUgTGltYSBlbmN1ZXN0YWRvcyBwYXJhIGNhZGEgbWVkaWRhCgpNb2RhICh2YWxvcik6IHBlcm1pdGlyw6Egc2FiZXIgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgbWF5b3JpdGFyaWEgZGUgbG9zIGNpdWRhZGFub3MgZGUgTGltYSBlbmN1ZXN0YWRvcwoKLVRpcG8gZGUgdHJhYmFqbywgRnJlY3VlbmNpYSBkZSBzYWxpZGEgcHJvbWVkaW8gYSBsYSBzZW1hbmEgLGFudGVzIHkgZGVzcHXDqXMgZGUgY2FkYSBtZWRpZGEgZGVsIGdvYmllcm5vCgpWYXJpYWJsZSBkaWNvdG9taXphZGEgVGlwbyBkZSB0cmFiYWpvPTAsMQoKQ29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsOiBpbmRpY2Fyw6EgY3XDoW4gcmVsYWNpb25hZG8gZXN0w6EgZWwgdGlwbyBkZSB0cmFiYWpvIGNvbiBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYQoKCi1FZGFkLCBGcmVjdWVuY2lhIGRlIHNhbGlkYSBwcm9tZWRpbyBhIGxhIHNlbWFuYSAsYW50ZXMgeSBkZXNwdcOpcyBkZSBjYWRhIG1lZGlkYSBkZWwgZ29iaWVybm8sIE1lZGlkYSBhcGxpY2FkYQoKTWVkaWE6IHBlcm1pdGlyw6EgY29ub2NlciBsYSBlZGFkIHByb21lZGlvIHBhcmEgY2FkYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBwcm9tZWRpbyB5IHBhcmEgY2FkYSBtZWRpZGEKCkNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBiaXNlcmlhbDogaW5kaWNhcsOhIGN1w6FuIHJlbGFjaW9uYWRvIGVzdMOhIGxhIGVkYWQgY29uIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhCgotRGlzdHJpdG8sIEZyZWN1ZW5jaWEgZGUgc2FsaWRhIHByb21lZGlvIGEgbGEgc2VtYW5hICxhbnRlcyB5IGRlc3B1w6lzIGRlIGNhZGEgbWVkaWRhIGRlbCBnb2JpZXJubyB5IG1lZGlkYSBhcGxpY2FkYQoKTW9kYSh2YWxvcik6IHBlcm1pdGlyw6EgY29ub2NlciBlbiBxdcOpIGRpc3RyaXRvIGluY2lkZW4gbcOhcyBlbiBsYXMgdmVjZXMgZGUgc2FsaWRhIGRlIGxhcyBwZXJzb25hcwoKLUNsYXNlIHNvY2lhbAoKTW9kYSh2YWxvcik6IHBlcm1pdGlyw6EgY29ub2NlciBlbCBuaXZlbCBkZSBpbmdyZXNvcyBwb3IgY2FkYSBkaXN0cml0by4KCiNEZXNjcmlwdG9yZXMgZ3LDoWZpY29zCgpVdGlsaXphcmVtb3M6CgpHcsOhZmljYSBkZSBkaXNwZXJzacOzbiBwYXJhIG5vdGFyIGbDoWNpbG1lbnRlIGNvbW8gYXVtZW50YSBvIGRlY3JlY2UgbGEgY2FudGlkYWQgZGUgaW5mZWN0YWRvcyBlIGluZmVjdGFkb3MgcG9yIGRpYSBhbnRlcyB5IGRlc3B1w6lzIGRlIHF1ZSBzZSBhcGxpcXVlIGxhIG1lZGlkYS4KQWRlbcOhcywgbGEgZ3LDoWZpY2EgZGUgZGlzcGVyc2nDs24gbm9zIHB1ZWRlIGF5dWRhciBhIGVuY29udHJhciB1bmEgcmVsYWNpw7NuIHkvbyBwYXRyw7NuIGVudHJlIGxhIGNhbnRpZGFkIGRlIGluZmVjdGFkb3MgeS9vIG1vdmlsaXphY2nDs24gc29jaWFsIHkgbG9zIGTDrWFzIHRyYW5zY3Vycmlkb3MgZGVzZGUgcXVlIHNlIGVtcGxlw7MgY2FkYSBtZWRpZGEuCgpUYW1iacOpbiB1dGlsaXphcmVtb3MgdW4gZ3LDoWZpY28gZGUgY2FqYSBkZSBiaWdvdGVzIHBhcmEgZGlmZXJlbmNpYXIgbGFzIGVkYWRlcyBkZSBsb3MgZW50cmV2aXN0YWRvcyBkZSBtYW5lcmEgcsOhcGlkYSB5IGVmZWN0aXZhLiBFc3RvIG5vcyBwZXJtaXRpcsOhIHZlciBsYSByZWxhY2nDs24gZW50cmUgbGFzIGVkYWRlcyB5IHJlc3B1ZXN0YXMgZGFkYXMgcG9yIGxhcyBwZXJzb25hcy4gCgpBZGVtw6FzLCBzZSB1dGlsaXphcsOhbiBncsOhZmljb3MgZGUgYmFycmFzIHByaW5jaXBhbG1lbnRlIHBhcmEgdmlzdWFsaXphciB5IGFuYWxpemFyIGxhcyByZXNwdWVzdGFzIGN1YWxpdGF0aXZhcy4gQ29uIGxvcyBncsOhZmljb3MgZGUgYmFycmFzIHNlIHBvZHLDoW4gdmVyIGN1YWxlcyBoYW4gc2lkbyBsYXMgcmVzcHVlc3RhcyBjdWFsaXRhdGl2YXMgcmVzcG9uZGlkYXMgY29uIG3DoXMgeSBtZW5vcyBmcmVjdWVuY2lhLgoKRmluYWxtZW50ZSwgc2UgdXNhcsOhbiBoaXN0b2dyYW1hIHBhcmEgZGVzY3JpYmlyIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBxdWUgcHVlZGVuIHNlciBkaXN0cmlidWlkYXMgZW4gcmFuZ29zLiBFc3RvIG5vcyBmYWNpbGl0YXLDoSBhbmFsaXphciBsb3MgZGF0b3MgY29uIG11Y2hvcyB2YWxvcmVzIG8gcmVzcHVlc3RhcyBwb3NpYmxlcy4KCgojIyBQbG90cyB5IG90cmFzIGNvc2FzCmBgYHtyfQojIGN1cmwgLUxzICIkdXJsIiA+IGRmX2Zvcm0uY3N2Cgp0bXAgPC0gdGVtcGZpbGUoKQpjdXJsX2Rvd25sb2FkKCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2UzVGd3NLSGw0UGh1a0lIZlNHYmZBOE5DUTVTcUJEcFExNktDNjlKQ2lGQVdWZUo0MEJBQ3AwZHFoQlRrSGk5Y3BMRV9KbUVtSXZmZHZBL3B1Yj9naWQ9NjM3MTAwODQzJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiLCB0bXApCnJlYWRfY3N2KHRtcCkgLT4gZGZfZm9ybTEKCiMgU2VndW5kYSBlbmN1ZXN0YQp0bXAgPC0gdGVtcGZpbGUoKQpjdXJsX2Rvd25sb2FkKCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2UzVGd3NLSGw0UGh1a0lIZlNHYmZBOE5DUTVTcUJEcFExNktDNjlKQ2lGQVdWZUo0MEJBQ3AwZHFoQlRrSGk5Y3BMRV9KbUVtSXZmZHZBL3B1Yj9naWQ9NjM3MTAwODQzJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiLCB0bXApCgpyZWFkX2Nzdih0bXApICU+JQogICAgcmVuYW1lKAogICAgICAgIHRpZW1wbyA9ICJNYXJjYSB0ZW1wb3JhbCIsCiAgICAgICAgZWRhZCA9ICLCv0N1w6FsIGVzIHR1IGVkYWQ/IiwKICAgICAgICBnZW5lcm8gPSAiwr9EZSBxdcOpIGfDqW5lcm8gZXJlcz8iLAogICAgICAgIGluZ3Jlc28gPSAiwr9DdcOhbnRvIGVzIGVsIGluZ3Jlc28gbWVuc3VhbCBwcm9tZWRpbyBkZSB0dSBmYW1pbGlhIGFwcm94aW1hZGFtZW50ZSAoc29sZXMpID8iLAogICAgICAgIGRpc3RyaXRvID0gIsK/RW4gcXXDqSBkaXN0cml0byB2aXZlcz8iLAogICAgICAgIGVzdHVkaW8gPSAiwr9DdcOhbCBmdWUgZWwgw7psdGltbyBuaXZlbCBlZHVjYXRpdm8gcXVlIGNvbXBsZXRhc3RlPyIsCiAgICAgICAgZW1wbGVvID0gIsK/Q3XDoWwgZXMgdHUgdGlwbyBkZSBlbXBsZW8/IiwKICAgICAgICBzYWxpZGFzID0gIsK/Q3XDoW50YXMgdmVjZXMgYSBsYSBzZW1hbmEsIGVuIHByb21lZGlvLCBzYWzDrWFzIGRlIGNhc2EgZHVyYW50ZSBsb3MgZMOtYXMgZGUgY3VhcmVudGVuYT8iLAogICAgICAgIHJhem9uZXMgPSAiwr9Qb3IgcXXDqSByYXpvbmVzIHNhbMOtYXMgZHVyYW50ZSBsYSBjdWFyZW50ZW5hPyIsCiAgICAgICAgc29jaWFsLmJvb2wgPSAiwr9MYSBtZWRpZGEgZGUgXCJJbm1vdmlsaXphY2nDs24gc29jaWFsXCIsIHJlYWxtZW50ZSBoaXpvIHF1ZSB0dXMgc2FsaWRhcyBkdXJhbnRlIHRvZGEgbGEgY3VhcmVudGVuYSBmdWVyYW4gbXV5IHBvY2FzPyIsCiAgICAgICAgc29jaWFsLjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/IEVuIGN1w6FudG8gZGlzbWludXnDsyB0dXMgc2FsaWRhcyBkdXJhbnRlIGxhIGN1YXJlbnRlbmE/IiwKICAgICAgICBvY2lvLmJvb2wgPSAiwr8gTGEgXCJTdXNwZW5zacOzbiBkZSBhY2Nlc28gYSBsdWdhcmVzIHDDumJsaWNvczogbHVnYXJlcyBkZSBvY2lvLCByZXN0YXVyYW50ZXMsIGV0Y1wiLCB0ZSBkZXNhbmltw7Mgc2FsaXIgZGUgY2FzYT8iLAogICAgICAgIG9jaW8uMDUgPSAiUmVzcGVjdG8gYSBsYSBhbnRlcmlvciBwcmVndW50YS4gRGVsIDAgYWwgNSwgwr9DdcOhbnRvIHRlIGRlc2FuaW3DsyBzYWxpciBkZSBjYXNhPyIsCiAgICAgICAgbm9kYXkuYm9vbCA9ICLCv0xhIG1lZGlkYSBcIkRpc3Bvc2ljacOzbiBzYWxpZGEgZGUgaG9tYnJlcyB5IG11amVyZXMgZW4gZMOtYXMgY29tcGxlbWVudGFyaW9zIChsdW5lcy1tacOpcmNvbGVzLXZpZXJuZXMgLyBtYXJ0ZXMtanVldmVzLXPDoWJhZG9zKVwiLCBnYXJhbnRpem8gcXVlIHNhbGllcmFzIG1lbm9zIHF1ZSBhbnRlcz8iLAogICAgICAgIG5vZGF5LjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/Q3XDoW50byBjYW1iaW8gdHVzIHNhbGlkYXM/IiwKICAgICAgICBtdWx0YS5ib29sID0gIsK/IExhIG1lZGlkYSBcIk11bHRhIGRlIFMvLjg2IC1TLy4zNDAgcGFyYSB0b2RhcyBsYXMgcGVyc29uYXMgcXVlIGRlc29iZWRlY2VuIGRpc3Bvc2ljaW9uZXMgZGVsIGdvYmllcm5vXCIsIGhpem8gcXVlIHR1cyBzYWxpZGFzIGRlIGNhc2EgZnVlcmFuIG1lbm9yZXM/IiwKICAgICAgICBtdWx0YS4wNSA9ICJSZXNwZWN0byBhIGxhIGFudGVyaW9yIHByZWd1bnRhLiBEZWwgMCBhbCA1LCDCv0N1w6FuIG1lbm9yZXMgZnVlcm9uIHR1cyBzYWxpZGFzPyIsCiAgICAgICAgYm9uby5ib29sID0gIsK/IExhIG1lZGlkYSBcIkVudHJlZ2EgZGUgYm9ubyBTLy4gMzgwLCBTLy43NjAgZGUgYWN1ZXJkbyBhbCBTaXN0ZW1hIGRlIEZvY2FsaXphY2nDs24gZGUgSG9nYXJlcyAoU0lTRk9IKSBcIiwgcGVybWl0acOzIHF1ZSByZWR1amVyYXMgdHVzIHNhbGlkYXMgZGUgY2FzYT8iLAogICAgICAgIGJvbm8uMDUgPSAiUmVzcGVjdG8gYSBsYSBhbnRlcmlvciBwcmVndW50YS4gRGVsIDAgYWwgNSwgwr9DdcOhbnRvIHNlIHJlZHVqbyB0dXMgc2FsaWRhcz8iLAogICAgICAgIGFmcDEuYm9vbCA9ICLCvyBMYSBtZWRpZGEgXCJSZXRpcm8gZGUgaGFzdGEgUy8uIDIwMDAgZGUgZm9uZG9zIEFGUCBkZSB0cmFiYWphZG9yZXMgYWZpbGlhZG9zIHF1ZSBubyB0aWVuZW4gcGxhbmlsbGFcIiwgdGUgbWFudHV2byBtw6FzIHRpZW1wbyBlbiBjYXNhPyIsCiAgICAgICAgYWZwMS4wNSA9ICJSZXNwZWN0byBhIGxhIGFudGVyaW9yIHByZWd1bnRhLiBEZWwgMCBhbCA1LCDCvyBDdcOhbiBtw6FzIHRlIG1hbnR1dmlzdGUgZW4gY2FzYT8iLAogICAgICAgIGFmcDIuYm9vbCA9ICLCvyBMYSBtZWRpZGEgXCJSZXRpcm8gZGVsIDI1JSBkZSBmb25kb3MgQUZQIHBhcmEgdHJhYmFqYWRvcmVzIGFmaWxpYWRvc1wiLCB0ZSBtYW50dXZvIG3DoXMgdGllbXBvIGVuIGNhc2E/IiwKICAgICAgICBhZnAyLjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/Q3XDoW50byB0aWVtcG8gbcOhcyB0ZSBtYW50dXZvIGVuIGNhc2E/IiwKICAgICAgICBkZWNjZWxlcmF0aW9uID0gIsK/UXXDqSBjb25kaWNpb25lcyBjcmVlcyBxdWUgZXhpc3RlbiBlbiB0dSBkaXN0cml0byBxdWUgcmV0YXJkYW4gbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZD8iLAogICAgICAgIGFjY2VsZXJhdGlvbiA9ICLCv1F1w6kgY29uZGljaW9uZXMgY3JlZXMgcXVlIGV4aXN0ZW4gZW4gdHUgZGlzdHJpdG8gcXVlIGFjZWxlcmFuIGxhIHByb3BhZ2FjacOzbiBkZWwgQ292aWQ/IgogICAgKSAlPiUKICAgIG11dGF0ZSgKICAgICAgICBnZW5lcm8gPSBhcy5mYWN0b3IoZ2VuZXJvKSwKICAgICAgICBpbmdyZXNvID0gYXMuZmFjdG9yKGluZ3Jlc28pLAogICAgICAgIGRpc3RyaXRvID0gYXMuZmFjdG9yKGRpc3RyaXRvKSwKICAgICAgICBlc3R1ZGlvID0gZmFjdG9yKGVzdHVkaW8sIGxldmVscyA9IGMoIlNlY3VuZGFyaWEiLCAiVMOpY25pY2EiLCAiVW5pdmVyc2l0YXJpYSIsICJQb3NncmFkbyIpKSwKICAgICAgICBlbXBsZW8gPSBmYWN0b3IoZW1wbGVvLCBsZXZlbHMgPSBjKCJObyB0cmFiYWpvIiwgIkluZm9ybWFsIiwgIkZvcm1hbCIpKSwKICAgICAgICAjIEVzdGViYW4gTmljb2xhcyBWaWxsYWNvcnRhIEdhcmNpYSBjYW1iacOzIGxhcyByZXNwdWVzdGFzIGRlIGxhIGVuY3Vlc3RhCiAgICAgICAgIyBkZSAiTWF5b3IgNSIgYSA2LgogICAgICAgIHNhbGlkYXMgPSByZXBsYWNlKHNhbGlkYXMsIHNhbGlkYXM9PSI2IiwgIk1heW9yIDUiKSwKICAgICAgICBzYWxpZGFzID0gZmFjdG9yKHNhbGlkYXMsIGxldmVscyA9IGMoMDo1LCAiTWF5b3IgNSIpKSwKICAgICAgICByYXpvbmVzID0gc3Ryc3BsaXQocmF6b25lcywgIiwgIiksCiAgICAgICAgc29jaWFsLmJvb2wgPSBzb2NpYWwuYm9vbCA9PSAiU8OtIiB8IHNvY2lhbC5ib29sID09ICJTaSIsCiAgICAgICAgb2Npby5ib29sID0gb2Npby5ib29sID09ICJTw60iIHwgb2Npby5ib29sID09ICJTaSIsCiAgICAgICAgbm9kYXkuYm9vbCA9IG5vZGF5LmJvb2wgPT0gIlPDrSIgfCBub2RheS5ib29sID09ICJTaSIsCiAgICAgICAgbXVsdGEuYm9vbCA9IG11bHRhLmJvb2wgPT0gIlPDrSIgfCBtdWx0YS5ib29sID09ICJTaSIsCiAgICAgICAgYm9uby5ib29sID0gYm9uby5ib29sID09ICJTw60iIHwgYm9uby5ib29sID09ICJTaSIsCiAgICAgICAgYWZwMS5ib29sID0gYWZwMS5ib29sID09ICJTw60iIHwgYWZwMS5ib29sID09ICJTaSIsCiAgICAgICAgYWZwMi5ib29sID0gYWZwMi5ib29sID09ICJTw60iIHwgYWZwMi5ib29sID09ICJTaSIsCiAgICAgICAgYWNjZWxlcmF0aW9uID0gc3Ryc3BsaXQoYWNjZWxlcmF0aW9uLCAiLCAiKSwKICAgICAgICBkZWNjZWxlcmF0aW9uID0gc3Ryc3BsaXQoZGVjY2VsZXJhdGlvbiwgIiwgIikKICAgICkgLT4gZGZfZm9ybTIKYGBgCgojIyMgRWRhZCBkZSBsYSBtdWVzdHJhCmBgYHtyfQpzdW1tYXJ5KGRmX2Zvcm0yJGVkYWQpCmJveHBsb3QoZGZfZm9ybTIkZWRhZCwgeGxhYiA9ICIiLCB5bGFiID0gIkVkYWQiLCBtYWluPU5VTEwpCnRpdGxlKCJHcsOhZmljbyAxLiBFZGFkIikKYGBgCgpNaW4uIDFzdCBRdS4gIE1lZGlhbiAgICBNZWFuIDNyZCBRdS4gICAgTWF4LiAKICAxNy4wMCAgIDIzLjAwICAgMzIuMDAgICAzNC41NyAgIDQ2LjAwICAgNjAuMDAgCgpuID0gMzEwLCBzZCA9IDEyLjYxOQoKUG9kZW1vcyBhc8OtIGRldGVybWluYXIgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBjYWxjdWxhbmRvOgoKZGVzdi9zcXJ0KG4pID0gMTIuNjE5IC9zcXJ0KDMxMCkgPTAuNzE2Nwp6IHQgYWxmYS8yID0gMS45NgoKVS5Cb3VuZCA9PiAzNC41NyArIDEuOTYgKiAxMi42MTkgPSA1OS4zMApMLkJvdW5kICA9PiAzNC41NyAtIDEuOTYgKiAxMi42MTkgPSA5Ljg0CgpTZSBzYWJlIHBvciB0YW50byBxdWUgbGEgbWVkaWEgcmVhbCBzZSBwdWVkZSBlbmNvbnRyYXIgZW4gWzkuODQsIDU5LjMwXSBjb24gOTUlIGRlIGNlcnRlemEuCgojIyMgR8OpbmVybwpgYGB7cn0KZGZfZm9ybTIgJT4lCiAgICBncm91cF9ieShnZW5lcm8pICU+JQogICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogICAgYmFycGxvdChufmdlbmVybywgZGF0YT0uLCB4bGFiPSJQZXJzb25hcyIsIHlsYWI9IkNhbnRpZGFkIikKCnRpdGxlKCJHcsOhZmljbyAyLiBHw6luZXJvIikKYGBgCgojIyMgSW5ncmVzbyBwcm9tZWRpbwoKYGBge3J9CnBhcihtYWkgPSBjKDAuOCwgMS41LCAwLjIsIDAuNSkpCmRmX2Zvcm0yICU+JQogICAgZ3JvdXBfYnkoaW5ncmVzbykgJT4lCiAgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgICBiYXJwbG90KG5+aW5ncmVzbywgZGF0YT0uLCBob3JpeiA9IFRSVUUsIGxhcyA9IDIsIHhsYWIgPSAiUGVyc29uYXMiLCB5bGFiPSIiKQp0aXRsZSh5bGFiPSJJbmdyZXNvIiwgbGluZT02KQp0aXRsZSgiR3LDoWZpY28gMy4gSW5ncmVzb3MiKQpgYGAKCiMjIyBEaXN0cml0bwpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTIwfQpwYXIobWFpID0gYygxLCAyLCAwLjUsIDAuNSkpCiNwbG90KGVkYWR+ZGlzdHJpdG8sIGRhdGEgPSBkZl9mb3JtMiwgaG9yaXpvbnRhbD1UUlVFLCBsYXM9MiwgeGxhYj0iIikKI3RpdGxlKHlsYWI9IkRpc3RyaXRvIiwgbGluZT04KQoKZGZfZm9ybTIkZGlzdHJpdG8gJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QoaG9yaXogPSBUUlVFLCBsYXMgPSAyLCB4bGFiID0gIlBlcnNvbmFzIiwgeWxhYj0iIikKdGl0bGUoIkdyw6FmaWNvIDQuIERpc3RyaXRvIikKYGBgCgojIyMgRW1wbGVvCmBgYHtyfQpwYXIobWFpID0gYygxLCAxLjUsIDAuNSwgMC41KSkKZGZfZm9ybTIkZW1wbGVvICU+JQogICAgdGFibGUoKSAlPiUKICAgIHNvcnQoVFJVRSkgJT4lCiAgICBiYXJwbG90KGhvcml6ID0gVFJVRSwgbGFzID0gMiwgeGxhYiA9ICJQZXJzb25hcyIsIHlsYWI9IiIpCgp0aXRsZSgiR3LDoWZpY28gNS4gVGlwbyBkZSB0cmFiYWpvIikKYGBgCgojIyMgwr9RdcOpIHRhbnRvIHZhcsOtYW4gbGFzIGNpZnJhcyBkZSBudWV2b3MgaW5mZWN0YWRvcyBkdXJhbnRlIGxvcyBwZXJpb2RvcyBkZSBpbnN0YXVyYWNpw7NuIHByZXZpb3MtcG9zdGVyaW9yZXMgYSBsYSBtZWRpZGE/CgpQYXJhIGVzdGEgcHJpbWVyYSBwcmVndW50YSBzZSBoYW4gcHJvY2VzYWRvIGxvcyBkYXRvcyB3ZWIuIFNlIHByZXNlbnRhcsOhbiBkb3MgZ3LDoWZpY29zIHBvciBjYWRhIHVuYSBkZSBsYXMgY3VhdHJvIG1lZGlkYXMgcXVlIHNlIGFuYWxpemFyw6FuLiBFbCBwcmltZXJvIGRlIGVsbG9zIHNlcsOhIGRlIGxvcyBudWV2b3MgY2Fzb3MgeSBlbCBzZWd1bmRvIGRlIGxhIG1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsIChjYW1iaW9zIGVuIGxhIG1vdmlsaXphY2nDs24pLiBMb3MgZGVzY3JpcHRvcmVzIHF1ZSBzZSBlc3TDoW4gdXRpbGl6YW5kbyBwYXJhIGRlc2NyaWJpciBtZWpvciBsb3MgZGF0b3Mgb2J0ZW5pZG9zIGVzIGxhIG1lZGlhIHkgbWVkaWFuYS4gRXMgbmVjZXNhcmlvIGRlc3RhY2FyIHF1ZSBzZSBoYSBvcHRhZG8gcG9yIGdyYWZpY2FyIGxvcyBkYXRvcyBkaWV6IGTDrWFzIGFudGVzIGRlIHF1ZSBzZSBkZWNyZXRlIGxhIG1lZGlkYSB5IGRpZXogZMOtYXMgZGVzcHXDqXMgZGUgaGFiZXJzZSBwcm9tdWxnYWRvLgojIyBEZWNsYXJhY2nDs24gZGVsIEVzdGFkbyBkZSBFbWVyZ2VuY2lhCiMgSW5jb3Jwb3JhciBlbCBuwrAgZGUgR3LDoWZpY28gNi4gCmRlY2xhcmFjacOzbiBudWV2b3MgY2Fzb3MKCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KI3JlcGVhdF9wbG90cygiMjAyMC0wMy0xNSIsIDEwLCAiRGVjbGFyYWNpw7NuIGRlIEVzdGFkbyBkZSBFbWVyZ2VuY2lhIikKCmNhdF9wbG90KGx1YnJpZGF0ZTo6eW1kKCIyMDIwLTAzLTE1IiksIDEwLCAiRGVjbGFyYWNpw7NuIGRlbCBlc3RhZG8gZGUgRW1lcmdlbmNpYSIsIHBsb3RfbmV3X2Nhc2VzLCAiTnVldm9zIGNhc29zIikKCiNkYXkgPC0gbHVicmlkYXRlOjp5bWQoZGF5KQojY2F0X3Bsb3QoZGF5LCByYW5nZSwgbWFpbl90aXRsZSwgcGxvdF9uZXdfY2FzZXMsICJOdWV2b3MgY2Fzb3MiKQojY2F0X3Bsb3QoZGF5LCByYW5nZSwgbWFpbl90aXRsZSwgcGxvdF9ybW92ZXMsICJNb3ZpbGl6YWNpw7NuIHJlY3JlYWNpb25hbCIpCmBgYAoKRW4gZXN0YSBncsOhZmljYSBwb2RlbW9zIHZpc3VhbGl6YXIgcXVlIGxhIGNhbnRpZGFkIGRlIGluZmVjdGFkb3MgcG9yIGTDrWEgYmFqw7MgZW4gYWxndW5vcyBkw61hcyBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpcyBkZSBxdWUgc2UgZGVjbGFyYXLDoSBlbCBlc3RhZG8gZGUgZW1lcmdlbmNpYS4gU2UgcHVlZGUgYXByZWNpYXIgZW4gbGEgZ3LDoWZpY2EgcXVlIHNlIGxsZXZhIGEgY2FibyBjYWRhIDIgbyAzIGTDrWFzIGR1cmFudGUgbGEgc2VtYW5hIHNpZ3VpZW50ZSBhIGxhIGltcGxlbWVudGFjacOzbiBkZWwgRXN0YWRvIGRlIEVtZXJnZW5jaWEuIEVzdG8gc2UgcG9kcsOtYSBkZWJlciBhIGZhY3RvcmVzIGNvbW8gbGEgY2FudGlkYWQgZGUgcHJ1ZWJhcyB0b21hZGFzIHBvciBkw61hLCBmcmVjdWVuY2lhIGRlIHNhbGlkYSBkZSBsYXMgcGVyc29uYXMgeSBlbCBjdW1wbGltaWVudG8gZGUgbGFzIGxleWVzIHkgbWVkaWRhcyB0b21hZGFzLiAKClBhcmEgYW5hbGl6YXIgZXN0YSBncsOhZmljYSwgc2UgYXN1bWUgcXVlIGVsIGNyZWNpbWllbnRvIGRlIGxhIGVuZmVybWVkYWQgYmFqbyBjb25kaWNpb25lcyBub3JtYWxlcyBlcyBleHBvbmVuY2lhbC4gUG9yIHRhbnRvLCBzZSBwdWVkZSBjb25zdHJ1aXIgdW4gbW9kZWxvIHRhbCBxdWU6CmxuKHkpIEF0K0IuIFRvbWFuZG8gYSBMMWNvbW8gcmVncmVzacOzbiBkZSBjb250cm9sIHNpbiB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIHkgTDJsYSByZWdyZXNpw7NuIGx1ZWdvIGRlIGFwbGljYXJzZSBsYSBtZWRpZGEsIHNlIHJlYWxpesOzIHVuIEYtdGVzdCBwYXJhIGNvbXByb2JhciBzaSBlbCBtb2RlbG8gTDFtb2RlbGEgYSBMMiBzaW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMuCgotSG8gOiBObyBleGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGFtYm9zIG1vZGVsb3MgCi1IYSA6IEV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWwgbW9kZWxvIGFudGVyaW9yIGEgbGEgbWVkaWRhIHkgZWwgYWN0dWFsLgoKSU1BR0VOCgpEYWRvIHF1ZSBsYSB2YXJpYW56YSAxID4gdmFyaWFuemEgMiwgbGEgZWxlY2Npw7NuIGRlbCBvcmRlbiBkZSBsYXMgdmFyaWFibGVzIGVzIGNvcnJlY3RhLiBQb3IgdGFudG8sIGRhZG8gRiA+IEYgY3LDrXRpY28sIHNlIGVuY3VlbnRyYSBldmlkZW5jaWEgcGFyYSBmYWxzZWFyIEhvLiBEYWRvID4gUChGPD1mKSB1bmEgY29sYSwgc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEsIHBvciBsbyBxdWUgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcy4gQ29tcGFyYW5kbyBsYXMgcGVuZGllbnRlcyBBMT0wLjMzNyB5IEEyPTAuMDcyOSBjb24gQTIgPEExLCBzZSBwdWVkZSBhc3VtaXIgcXVlIHNlIGZyZW7DsyBsYSBleHBhbnNpw7NuIGRlIGxhIGVuZmVybWVkYWQuCgojbmNvcnBvcmFyIGVsIG7CsCBkZSBHcsOhZmljbyA3LiB0w610dWxvCm1pc21hIG1lZGlkYSBwZXJvIGxhIGRlIGNhbWJpbwoKUExPVAoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQojcmVwZWF0X3Bsb3RzKCIyMDIwLTAzLTE1IiwgMTAsICJEZWNsYXJhY2nDs24gZGUgRXN0YWRvIGRlIEVtZXJnZW5jaWEiKQoKY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDMtMTUiKSwgMTAsICJEZWNsYXJhY2nDs24gZGVsIGVzdGFkbyBkZSBFbWVyZ2VuY2lhIiwgcGxvdF9ybW92ZXMsICJNb3ZpbGl6YWNpw7NuIHJlY3JlYWNpb25hbCIpCgojZGF5IDwtIGx1YnJpZGF0ZTo6eW1kKGRheSkKI2NhdF9wbG90KGRheSwgcmFuZ2UsIG1haW5fdGl0bGUsIHBsb3RfbmV3X2Nhc2VzLCAiTnVldm9zIGNhc29zIikKI2NhdF9wbG90KGRheSwgcmFuZ2UsIG1haW5fdGl0bGUsIHBsb3Rfcm1vdmVzLCAiTW92aWxpemFjacOzbiByZWNyZWFjaW9uYWwiKQpgYGAKCkEgcGFydGlyIGRlbCBncsOhZmljbyA3LCBzZSBsb2dyYSB2aXN1YWxpemFyIHF1ZSBwcmV2aW8gYSBsYSBwcm9tdWxnYWNpw7NuIGRlIGxhIG1lZGlkYSDigJxEZWNsYXJhY2nDs24gZGUgRXN0YWRvIGRlIEVtZXJnZW5jaWHigJ0sIGxhIGdlbnRlIHRlbsOtYSBtdWNoYSBtw6FzIG1vdmlsaXphY2nDs24geSBsdWVnbyBkZSBkZWNyZXRhZGEsIGVsIGNhbWJpbyBkZSBtb3ZpbGl6YWNpw7NuIGRpc21pbnV5w7MgZW4gZ3JhbiBtZWRpZGEuIEVsIHByb21lZGlvIHkgbWVkaWFuYSAobMOtbmVhcyBjb250aW51YXMpIGFudGVzIGRlIHF1ZSBzZSBhcGxpcXVlIGVzdGEgbWVkaWRhIGVzIGFwcm94aW1hZGFtZW50ZSAtMy4gUG9yIG90cm8gbGFkbywgZWwgcHJvbWVkaW8geSBtZWRpYW5hIChsw61uZWFzIHB1bnRlYWRhcykgZGVzZGUgZWwgcXVpbmNlIGhhc3RhIGVsIHZlaW50aWNpbmNvIGVzdMOhIHBvciBkZWJham8gZGUgLTYwLgoKUGFyYSBjb21wcm9iYXIgbGEgc2lnbmlmaWNhbmNpYSBkZSBlc3RhIGRpZmVyZW5jaWEsIHNlIHJlYWxpesOzIHVuIHRlc3QtdCBkZSBtZWRpYXMuIFNlIGFzdW1pZXJvbiBsYXMgc2lndWllbnRlcyBoaXDDs3Rlc2lzOgoKLUhvIDogTm8gZXhpc3RlIHVuIGVmZWN0byBzaWduaWZpY2F0aXZvIGRlIGxhIG1lZGlkYSBwb3Igc29icmUgbGFzIG1lZGlhcyBkZWwgQ2FtYmlvIGRlIE1vdmlsaXphY2nDs24KLUhhIDogRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYXMgbWVkaWFzIGRlIGxhIHZhcmlhYmxlIENhbWJpbyBkZSBNb3ZpbGl6YWNpw7NuIHBhcmEgYW50ZXMgeSBkZXNwdcOpcyBkZSBlamVjdXRhcnNlIGxhIG1lZGlkYS4KCltpbWFnZW5dCgpEYWRvIHF1ZSBlbCB2YWxvciB8dHwgPiB0LWNyw610aWNvIGRvcyBjb2xhcywgc2UgcHVlZGUgZW5jb250cmFyIGV2aWRlbmNpYSBwYXJhIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSBIby4gRGFkbyA9MC4wNSA+IFAoVDw9dCkgZG9zIGNvbGFzLCBleGlzdGUgc2lnbmlmaWNhbmNpYSBzdWZpY2llbnRlIHBhcmEgZWxsby4gUG9yIHRhbnRvLCBzZSByZWNoYXphIEhvLCBleGlzdGllbmRvIHBvciB0YW50byBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbnRlcyBkZSBlamVjdXRhcnNlIGxhIGRlY2xhcmFjacOzbiBkZSBFc3RhZG8gZGUgRW1lcmdlbmNpYSB5IGRlc3B1w6lzIHNvYnJlIGxhIG1vdmlsaXphY2nDs24gZGUgbGFzIHBlcnNvbmFzLiBEZWJpZG8gYSBxdWUgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGVzIG1lbm9yIGEgMCwgc2UgcHVlZGUgYWZpcm1hciBxdWUgZWwgY2FtYmlvIGFkZW3DoXMgcmVkdWpvIGxhIG1vdmlsaXphY2nDs24uCiMjIEFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMKCkVzdGUgZ3LDoWZpY28gbm9zIG11ZXN0cmEgbGEgY2FudGlkYWQgZGUgY2Fzb3MgZGlleiBkw61hcyBhbnRlcyB5IGRpZXogZMOtYXMgZGVzcHXDqXMgZGUgcXVlIGxhIG1lZGlkYSDigJxBcHJvYmFjacOzbiBkZWwgUGFkcsOzbiBkZSBIb2dhcmVz4oCdIGZ1ZXJhIGFwcm9iYWRhLiBFc3RhIGVzIHVuYSBncsOhZmljYSBtdXkgaW1wb3J0YW50ZSwgZGFkbyBxdWUgdGVuw61hIGNvbW8gb2JqZXRpdm8gYXl1ZGFyIGEgbGFzIHBvYmxhY2lvbmVzIG3DoXMgdnVsbmVyYWJsZXMgZW4gY29uZGljacOzbiBkZSBleHRyZW1hIHBvYnJlemEgYSBuaXZlbCBuYWNpb25hbCBwYXJhIHF1ZSBwdWRpZXJhbiBzdWJzaXN0aXIgZHVyYW50ZSBsYSBjdWFyZW50ZW5hLiBEaWNobyBlbiBvdHJhcyBwYWxhYnJhcywgcGFyYSBxdWUgcHVkaWVyYW4gYWNjZWRlciBhIGxvcyBzZXJ2aWNpb3MgYsOhc2ljb3MgeSBtZWRpY2FtZW50b3MsIGVuIGNhc28gZnVlc2VuIHJlcXVlcmlkb3MuIExhIGNhbnRpZGFkIGRlIGNhc29zIGFudGVzIGRlIHF1ZSBsYSBtZWRpZGEgZnVlc2UgZGVjbGFyYWRhLCAwOC8wMyBoYXN0YSAxOC8wMywgIHZhIGRlc2RlIGFwcm94aW1hZGFtZW50ZSB1bm8gaGFzdGEgdmVpbnRlLiBObyBvYnN0YW50ZSwgZGVzZGUgMTgvMDMgaGFzdGEgMjgvMDMgbGEgY2FudGlkYWQgZGUgY2Fzb3MgdmEgZW4gYXVtZW50by4gU2luIGR1ZGEgYWxndW5hLCBlbCBvYmpldGl2byBlcmEgYnVlbm8sIHBlcm8gcGFyYSBlbCBwYW5vcmFtYSBxdWUgc2UgZXN0YWJhIHZpdmllbmRvIG5vIGZ1ZSBlZmVjdGl2YS4gVW5hIHBvc2libGUgaGlww7N0ZXNpcyBzZXLDrWEgbGEgc2FsaWRhIG9ibGlnYXRvcmlhIGRlIGxvcyBiZW5lZmljaWFyaW9zIGEgbG9zIGJhbmNvcyBhIGZvcm1hciBsYXJnYXMgY29sYXMgZHVyYW50ZSBob3Jhcy4gRXN0byBleHBsaWNhcsOtYSBlbCBhdW1lbnRvIGRlIGNhc29zLgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wMy0xOCIpLCAxMCwgIkFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMiLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCmBgYAogCiNncmFmaWNvIDggbnVldm9zIGNhc29zCiAKU2UgcmVhbGl6w7MgdW4gZi10ZXN0IHNvYnJlIGxvcyBpbnB1dHMgYSBsYSByZWdyZXNpw7NuIGxpbmVhbCBkZWwgbG9nYXJpdG1vIGRlIGxhIGdyw6FmaWNhLCBzaWd1aWVuZG8gZWwgbW9kZWxvIHBsYW50ZWFkbyBhcnJpYmEuIFNlIGNvbG9jw7MgY29tbyBjb250cm9sIGEgdG9kb3MgbG9zIGRhdG9zIHByZXZpb3MgYSBkZWNsYXJhcnNlIGxhIG1lZGlkYS4gU2UgcGxhbnRlYXJvbiBsYXMgc2lndWllbnRlcyBoaXDDs3Rlc2lzOgpIbyA6IE5vIGV4aXN0ZSB1biBlZmVjdG8gc2lnbmlmaWNhdGl2byBkZSBsYSBtZWRpZGEgcG9yIHNvYnJlIGxhIHRlbmRlbmNpYSBkZSBsb3MgbnVldm9zIGNhc29zIGNvbiByZXNwZWN0byBhbCBjb250cm9sLgpIYSA6IEV4aXN0ZW4gdW4gZWZlY3RvIHNpZ25pZmljYXRpdm8gZW50cmUgbGFzIG11ZXN0cmFzIGRlIGNvbnRyb2wgeSBsYSBkYXRhIHBvc3RlcmlvciBhIGxhIGRlY2xhcmFjacOzbi4KCklNQUdFTgoKRGFkbyBxdWUgbGEgcHJpbWVyYSB2YXJpYW56YSBlcyBtYXlvciBhIGxhIHNlZ3VuZGEsIGVsIG9yZGVuIGRlIG9wZXJhY2nDs24gZGUgbG9zIGRhdG9zIGVzIGNvcnJlY3RvLiBDb21vIHRhbCwgZGFkbyBGID4gRi1jcml0aWNvIHVuYSBjb2xhLCBlbmNvbnRyYW1vcyBldmlkZW5jaWEgZW4gY29udHJhIGRlIEhvLiBEYWRvIGFkZW1hcyBQKEY8PWYpIDwgLCBzZSBwdWVkZSBnYXJhbnRpemFyIGxhIGRlY2lzacOzbiBkZSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEsIHBvciBsbyBxdWUgZGViZW4gZXhpc3RpciBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsb3MgZGF0b3MuIERhZG8gYWRlbcOhcyBBMT0gMC4yNjcyID4gQTI9MC4wMTE2LCBzZSBwdWVkZSBhZmlybWFyIHF1ZSBsYSBtZWRpZGEgcmVkdWpvIGxhIHRhc2EgZGUgaW5mZWNjacOzbi4KCiNHUkFGSUNPIDkgQ0FNQklPUwoKRXN0YSBncsOhZmljYSwgYWwgaWd1YWwgcXVlIGxhIEdyw6FmaWNhIDcsIG1hbmlmaWVzdGEgdW4gY29tcG9ydGFtaWVudG8gc2ltaWxhci4gU2luIGVtYmFyZ28sIGEgcGFydGlyIGRlIGxhIGRpc21pbnVjacOzbiBkZSBsYSBjdXJ2YSBzZSBwb2Ryw61hbiBnZW5lcmFyIGFsZ3VuYXMgY29uamV0dXJhcy4gTGEgcHJpbWVyYSBkZSBlbGxhcyBlcyBxdWUgbGFzIHBlcnNvbmFzIHRlbsOtYW4gdW4gcmVzcGFsZG8gcGFyYSBwb2RlciBjb21wcmFyIHN1cyBhbGltZW50b3MgeSBtZWRpY2FtZW50b3MgZGUgc2VyIG5lY2VzYXJpbyBwb3IgbG8gcXVlIHlhIG5vIHRlbsOtYW4gcXVlIHNhbGlyIGEgbGFzIGNhbGxlcyBkZSBtYW5lcmEgY29uY3VycmlkYSBhIHZlbmRlciBwcm9kdWN0b3MsIGVudHJlIG90cmFzIGNvc2FzLiBDYWJlIHJlc2FsdGFyIHF1ZSBjb24gZXN0byBubyBxdWVyZW1vcyBkZWNpciBxdWUgbGEgcG9ibGFjacOzbiBubyBzYWzDrWEgeSBxdWUgbGEgbWVkaWRhIGZ1ZSAxMDAlIGVmZWN0aXZhLiBBbCBjb250cmFyaW8sIGxhIHBvYmxhY2nDs24gb2JqZXRpdm8gc2FsacOzIHBhcmEgaGFjZXIgZWwgcmV0aXJvIGRlbCBzdWJzaWRpbyBwb3IgbG8gcXVlIGVsIG7Dum1lcm8gZGUgY2Fzb3MgYXVtZW50w7MuIFNpbiBlbWJhcmdvLCBlc3RvIHRhbWJpw6luIGNvbnRyaWJ1ecOzIGEgcXVlIGVuIGTDrWFzIHBvc3RlcmlvcmVzIHNlIHF1ZWRlbiBlbiBjYXNhLCBkZWJpZG8gYSBxdWUgY29udGFiYW4gY29uIGRpbmVybyBwYXJhIHN1YnNpc3RpciBwb3IgdW4gcGFyIGRlIHNlbWFuYXMgbcOhcyAodmFyw61hIHNlZ8O6biBlbCBuw7ptZXJvIGRlIGludGVncmFudGVzKS4gRXN0YXMgYWZpcm1hY2lvbmVzIHNlIHJlc3BhbGRhbiBjb24gbGEgbWVkaWEgeSBtZWRpYW5hIGFudGVzIGRlbCBkZWNyZXRvIChsw61uZWFzIGNvbnRpbnVhcyksIGRhZG8gcXVlIHNlIHViaWNhIGVuIGxhIHBhcnRlIHN1cGVyaW9yIGRlbCBncsOhZmljbywgbWllbnRyYXMgcXVlIGxhIG1lZGlhIHkgbWVkaWFuYSAobMOtbmVhcyBwdW50ZWFkYXMpIHBvciBkZWJham8gZGUgLTYwLgoKI0dSQUZJQ08gREUgQ0FNQklPUyBSRUNSRUFDSU9OQUxFUyBZIEVTTwoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wMy0xOCIpLCAxMCwgIkFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMiLCBwbG90X3Jtb3ZlcywgIk1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsIikKYGBgCgpVdGlsaXphbmRvIHVuIHRlc3QtdCBwYXJhIG1lZGlhcyBlbiBhbWJhcyBzZWNjaW9uZXMgZGUgbGEgZ3LDoWZpY2EsIHBvZGVtb3MgZGV0ZXJtaW5hciBzaSBleGlzdGUgdW4gZWZlY3RvIGRlIGxhIG1lZGlkYSBwb3Igc29icmUgbGEgdHJlbmQgZ2VuZXJhbC4KSG8gOiBObyAgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbWJhcyBzZWNjaW9uZXMgZGUgbGEgZ3LDoWZpY2EuCkhhIDogRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbWJhcyBzZWNjaW9uZXMgZGUgbGEgZ3LDoWZpY2EuCgpJTUFHRU4KCkRhZG8gcXVlIGVsIGVzdGFkw61zdGljbyB8dHwgPiB0LWNyw610aWNvIGRvcyBjb2xhcywgc2UgZW5jdWVudHJhIGV2aWRlbmNpYSBwYXJhIGZhbHNlYXIgbGEgaGlww7N0ZXNpcyBudWxhLiBEYWRvIHF1ZSBQKFQ8PXQpIDwgLCBsYSBlbGVjY2nDs24gZXMganVzdGlmaWNhYmxlLCBwb3IgbG8gcXVlIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhLCBjb25jbHV5ZW5kbyBwb3IgdGFudG8gcXVlIGV4aXN0ZSB1bmEgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVudHJlIGFtYmFzIHNlY2Npb25lcyBkZSBsYSBncsOhZmljYS4gRGViaWRvIGEgcXVlIGxhIGNvcnJlbGFjacOzbiBlcyBuZWdhdGl2YSwgc2UgY29uY2x1eWUgcXVlIGxhIG1lZGlkYSByZWR1am8gCgojIyBTYWxpZGEgYWx0ZXJuYWRhIHBvciBnw6luZXJvCgpFbCBncsOhZmljbyAxMCBleGhpYmUgbGEgY2FudGlkYWQgZGUgY2Fzb3MgYW50ZXMgeSBkZXNwdcOpcyBkZSBhcGxpY2Fyc2UgbGEgbWVkaWRhIOKAnFNhbGlkYSBhbHRlcm5hZGEgcG9yIGfDqW5lcm/igJ0uIEVuIHVuIHByaW1lciBtb21lbnRvIGVzdGEgbWVkaWRhIHRlbsOtYSBjb21vIG9iamV0aXZvIGRpc21pbnVpciBlbCBuw7ptZXJvIGRlIGNvbnRhZ2lvcy4gUG9yIHRhbCByYXrDs24sIGVsIEdvYmllcm5vIGRlY3JldMOzIGRldGVybWluYWRvcyBkw61hcyBkZSBzYWxpZGEgcGFyYSBtdWplcmVzIHkgb3Ryb3MgcGFyYSB2YXJvbmVzLCB5IGxvcyBkb21pbmdvcyBuYWRpZSBzYWzDrWEuIE5vIG9ic3RhbnRlLCBhIHBhcnRpciBkZSBsYSByZXByZXNlbnRhY2nDs24gc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGVsIG7Dum1lcm8gZGUgY2Fzb3MgYXVtZW50w7MgZGUgYXByb3hpbWFkYW1lbnRlIGNpZW4gYSBtaWwgY2llbiBjYXNvcy4gRGVzcHXDqXMgZGUgbG9zIHJlcG9ydGFqZXMgdmlzdG9zLCBwb2Ryw61hbW9zIHRyYXRhciBkZSBleHBsaWNhciBlc3RlIGNvbXBvcnRhbWllbnRvIGJhc8OhbmRvbm9zIGVuIGxvIHNpZ3VpZW50ZTogbGFzIG1hbcOhcyBjb25zaWRlcmFuIHF1ZSBsb3MgdmFyb25lcyAoZXNwb3Nvcykgbm8gc2FiZW4gaGFjZXIgbGFzIGNvbXByYXMgZGUgbWVyY2Fkby4gQWxndW5vcyBkaXLDrWFuIHF1ZSBlc3RvIG5vIHRpZW5lIGZ1bmRhbWVudG8sIHBlcm8gYW5hbGl6YW5kbyBkZXRhbGxhZGFtZW50ZSBsb3MgcmVwb3J0YWplcywgcHVkaW1vcyByZWNvbm9jZXIgcXVlIGVuIGxvcyBkw61hcyBkZSBzYWxpZGEgZGUgbXVqZXJlcyBoYWLDrWEgbXVjaGEgbcOhcyBhZ2xvbWVyYWNpw7NuIHkgZGVzb3JkZW4sIGEgZGlmZXJlbmNpYSBkZSBsb3MgZMOtYXMgZW4gcXVlIGxlcyB0b2NhYmEgc2FsaXIgYSBsb3MgdmFyb25lcy4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KI3JlcGVhdF9wbG90cygiMjAyMC0wNC0wMyIsIDEwLCAiU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybyIpCmNhdF9wbG90KGx1YnJpZGF0ZTo6eW1kKCIyMDIwLTA0LTAzIiksIDEwLCAiU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybyIsIHBsb3RfbmV3X2Nhc2VzLCAiTnVldm9zIGNhc29zIikKYGBgCgojR1JBRklDTyAxMCBOVUVWT1MgQ0FTT1MKClBhcmEgY29tcHJvYmFyIGVzdGFkw61zdGljYW1lbnRlIHNpIGVzIHF1ZSBsYSBtZWRpZGEgZnVlIGVmZWN0aXZhIG8gbm8sIHNlIHJlYWxpesOzIGVsIHRlc3QgRiBzb2JyZSBsYSBmb3JtYSBsb2dhcsOtdG1pY2EgZGUgbGEgcmVncmVzacOzbi4gRGViaWRvIGEgcXVlIGxhIHJlZ3Jlc2nDs24gbm8gc2UgY2VudHJhIGVuIDAsIHNlIG5vcm1hbGl6YXJvbiBsb3MgcHVudG9zIHByZXZpYW1lbnRlLiAKCkhvIDogTm8gZXhpc3RlIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBkb3Mgc2V0cyBkZSBwdW50b3MuIApIYSA6IEV4aXN0ZSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBlbCBzZXQgZGUgcHVudG9zIGFudGVzIHkgZGVzcHVlcyBkZSBhcGxpY2Fyc2UgbGEgbWVkaWRhLgoKSU1BR0VOCgpEYWRvIHF1ZSBGIDwgRi1jcsOtdGljbyB1bmEgY29sYSwgbm8gc2UgcHVlZGUgZmFsc2VhciBsYSBoaXDDs3Rlc2lzIG51bGEuIEFkZW3DoXMsIGNvbW9QKEY8PWYpIHVuYSBjb2xhID4gMC4wNSwgc2UgZGVjaWRlIG1hbnRlbmVyIGxhIGhpcMOzdGVzaXMgbnVsYSwgY29uc2lkZXJhbmRvIHF1ZSBubyBleGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzLiBDb24gZXN0bywgc2UgY29tcHJ1ZWJhIHF1ZSBsYSBtZWRpZGEgbm8gdHV2byDDqXhpdG8gZW4gcmVkdWNpciBsb3MgbnVldm9zIGNhc29zLgoKI0dSQUZJQ08gREUgQ0FNQklPUwoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wNC0wMyIpLCAxMCwgIlNhbGlkYSBhbHRlcm5hZGEgcG9yIGfDqW5lcm8iLCBwbG90X3Jtb3ZlcywgIk1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsIikKYGBgCgpTZSBwdWVkZSBvYnNlcnZhciB1biBsZXZlIGNhbWJpbyBlbiBsYSBwb3NpY2nDs24gZGUgbGFzIG1lZGlhcyBkZSBhbWJvcyBkYXRhc2V0cy4gUGFyYSBjb21wcm9iYXIgbGEgc2lnbmlmaWNhbmNpYSBkZSBlc3RhIGRpZmVyZW5jaWEsIHNlIHBsYW50ZWEgdW4gdGVzdC10LiBBc3VtaWVuZG86CgpIbzogTm8gc2UgcHVlZGUgZW5jb250cmFyIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBkb3MgZmFzZXMuCgpIYTogRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbnRlcyBkZSBkZWNsYXJhcnNlIGxhIG1lZGlkYSB5IHRyYXMgc3UgZWplY3VjacOzbi4KCklNQUdFTgoKRGFkbyBxdWUgfHRTdGF0fCA8IHQgY3JpdGljbyBkb3MgY29sYXMsIG5vIHNlIHB1ZWRlIGVuY29udHJhciBldmlkZW5jaWEgcXVlIG5pZWd1ZSBIby4gRGFkbyBhZGVtw6FzIHF1ZSBQKFQ8PXQpID4gLCBubyBzZSBsbGVnYSBhIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSwgcG9yIGxvIHF1ZSBzZSBhc3VtZSBxdWUgbm8gZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyB0cmFzIGxhIG1lZGlkYS4KCgojI1Blcm1pc28gZGUgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiw6FzaWNvcwoKI2dyYWZpY28gZGUgbnVldm9zIGNhc29zCgpFbiBlbCBncsOhZmljbyBuw7ptZXJvIDEyIGhheSB1bmEgb2JzZXJ2YWNpw7NuIG11eSBwb2NvIGV2aWRlbnRlIHF1ZSBzZSBwdWVkZSB2ZXIuIFBvY29zIGTDrWFzIGFudGVyaW9yZXMgYSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgbGEgbWVkaWRhIGVuIGNvbnNpZGVyYWNpw7NuLCBsb3MgbnVldm9zIGNhc29zIGVtcGV6YXJvbiBhIGluY3JlbWVudGFyIGRlc3B1w6lzIGRlIGhhYmVyc2UgbWFudGVuaWRvIHJlbGF0aXZhbWVudGUgY29uc3RhbnRlcyBwb3IgdW4gdGllbXBvLiBFbCBpbmNyZW1lbnRvIGRlIGVzdG9zIG51ZXZvcyBjYXNvcyBhbCBwYXJlY2VyIGZ1ZSBjb250cm9sYWRvIHBvciB1bm9zIGRpYXMgcG9zdGVyaW9yZXMgZGUgc2VyIHRvbWFkYSBsYSBtZWRpZGEuIFNpbiBlbWJhcmdvLCBlbiBsYSBncsOhZmljYSBzZSBwdWVkZSB2aXN1YWxpemFyIHF1ZSBhcHJveGltYWRhbWVudGUgdW5hIHNlbWFuYSBkZXNwdcOpcyBkZSBoYWJlcnNlIHRvbWFkbyBlc3RhIG1lZGlkYSBsb3MgY2Fzb3MgZW1wZXphcm9uIGEgaW5jcmVtZW50YXIgbnVldmFtZW50ZS4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KI3JlcGVhdF9wbG90cygiMjAyMC0wNC0yMCIsIDEwLCAiUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGJhc2ljb3MiKQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wNC0yMCIpLCAxMCwgIlBlcm1pc28gZGUgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiYXNpY29zIiwgcGxvdF9uZXdfY2FzZXMsICJOdWV2b3MgY2Fzb3MiKQpgYGAKCgpQYXJhIGNvbXByb2JhciBsYSBzaWduaWZpY2FuY2lhIGRlIGVzdGEgZGlmZXJlbmNpYSwgc2UgcGxhbnRlYSB1biB0ZXN0LWYuIEFzdW1pZW5kbyBhIGxvcyBwdW50b3MgdWJpY2Fkb3MgYW50ZXMgZGUgbGEgYXBsaWNhY2nDs24gZGUgbGEgbWVkaWRhIGNvbW8gY29udHJvbDoKCkhvOiBObyBzZSBwdWVkZSBlbmNvbnRyYXIgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgbGEgZmFzZSBkZSBjb250cm9sIHkgdHJhcyBhcGxpY2FyIGxhIG1lZGlkYS4KCkhhOiBFeGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGFudGVzIGRlIGRlY2xhcmFyc2UgbGEgbWVkaWRhIHkgdHJhcyBzdSBlamVjdWNpw7NuLgoKSU1BR0VOCgpEYWRvIEYgPCBGLWNyw610aWNvIHVuYSBjb2xhLCBubyBzZSBlbmN1ZW50cmEgZXZpZGVuY2lhIGVuIGNvbnRyYSBkZSBsYSBoaXDDs3Rlc2lzIG51bGEuIENvbW8gUChGPD1mKT4wLjA1LCBubyBzZSByZWNoYXphIEhvLCBhc3VtaWVuZG8gcG9yIHRhbnRvIHF1ZSBubyBleGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVuIGVsIHJhdGlvIGRlIGFwYXJpY2nDs24gZGUgbnVldm9zIGNhc29zLgoKI2FxdWkgdmEgZWwgZ3JhZmljbyBkZSBjYW1iaW9zCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KI3JlcGVhdF9wbG90cygiMjAyMC0wNC0yMCIsIDEwLCAiUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGJhc2ljb3MiKQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wNC0yMCIpLCAxMCwgIlBlcm1pc28gZGUgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiYXNpY29zIiwgcGxvdF9ybW92ZXMsICJNb3ZpbGl6YWNpw7NuIHJlY3JlYWNpb25hbCIpCmBgYAoKRW4gZXN0YSBncsOhZmljYSBwb2RlbW9zIHZlciBxdWUgbGEgbWVkaWRhIGRlIHBlcm1pc28gZGUgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiw6FzaWNvcyBubyBhZmVjdMOzIGRlIG1hbmVyYSBldmlkZW50ZSBsYSBtb3ZpbGl6YWNpw7NuIHNvY2lhbCwgeWEgcXVlIG5vIHNlIHB1ZWRlIHZlciB1bmEgcmVkdWNjacOzbiBvIGluY3JlbWVudG8gdG90YWxtZW50ZSBjbGFybyBlbiBsb3MgZMOtYXMgcG9zdGVyaW9yZXMgYSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgZXN0YSBtZWRpZGEuIFNlIHB1ZWRlIG9ic2VydmFyIGVzdG8gbWVkaWFudGUgdW4gdC10ZXN0LiBBc3VtaWVuZG8gYXPDrToKCkhvID0gTm8gZXhpc3RlIGRpZmVyZW5jaWEgYW50ZXMgeSBkZXNwdcOpcyBkZSBhcGxpY2Fyc2UgbGEgbWVkaWRhCgpIYSA9IEV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW4gbGEgbW92aWxpemFjacOzbiBlbnRyZSBlbCBwZXJpb2RvIHByZXZpbyBhIGxhIGRlY2xhcmFjacOzbiAgeSBlbCBwb3N0ZXJpb3IuCgpJTUFHRU4KCgpEYWRvIHF1ZSB8dHwgPCB0LWNyw610aWNvLCBubyBzZSBwdWVkZSBzb2x2ZW50YXIgbGEgaWRlYSBkZSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIGRpcmVjdGFtZW50ZS4gRGFkbyBhZGVtw6FzIHF1ZSAgUChUPHQpID4gLCBubyBzZSBsbGVnYSBhIHJlY2hhemFyIGNvbXBsZXRhbWVudGUgSG8sIHBvciBsbyBxdWUgc2UgYXN1bWUgcXVlIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMuCgoKCiMjIyBGcmVjdWVuY2lhIGRlIHNhbGlkYQpgYGB7cn0KZGZfZm9ybTIgJT4lCiAgICBncm91cF9ieShzYWxpZGFzKSAlPiUKICAgIHN1bW1hcmlzZShuPW4oKSkgJT4lCiAgICBiYXJwbG90KG5+c2FsaWRhcywgZGF0YT0uLCB5bGFiID0gIlBlcnNvbmFzIiwgeGxhYj0iU2FsaWRhcyIpCgp0aXRsZSgiU2FsaWRhcyBwb3Igc2VtYW5hIikKYGBgCgojIyMgQ2Fzb3MgcG9yIGRpc3RyaXRvCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MjB9CnBhcihtYWkgPSBjKDEsIDIuNSwgMSwgMC41KSkKZGYgJT4lIGZpbHRlcihQUk9WSU5DSUEgPT0gIkxJTUEiKSAlPiUKICAgIHNlbGVjdChESVNUUklUTykgJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QobGFzPTEsIGhvcml6PVRSVUUsIHhsYWI9IkNhc29zIikKdGl0bGUoIkNhc29zIHBvciBkaXN0cml0byIpCmBgYAojIyMgUmF6b25lcwpgYGB7cn0KCmRmX2Zvcm0yJHJhem9uZXMgJT4lIHVubGlzdCgpICU+JSB0YWJsZSgpIC0+IHJhem9uZXNfdCAKd29yZGNsb3VkKG5hbWVzKHJhem9uZXNfdCksIGFzLnZlY3RvcihyYXpvbmVzX3QpLCBtaW4uZnJlcSA9IDIpCgp0aXRsZSgiUmF6b25lcyBwYXJhIHNhbGlyIGR1cmFudGUgbGEgY3VhcmVudGVuYSIpCmBgYAoKIyMjIE1lZGlkYXMKYGBge3J9CnBhcihtYWkgPSBjKDEsIDIuNSwgMC41LCAwLjUpKQoKKHRhYmxlKGMoCiAgICByZXAoIklubW92aWxpemFjacOzbiIsICAgICAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGRmX2Zvcm0yJHNvY2lhbC5ib29sKSkpLAogICAgcmVwKCJObyBhY2Nlc28gYSBsdWdhcmVzIHDDumJsaWNvcyIsIGxlbmd0aCh3aGljaChkZl9mb3JtMiRvY2lvLmJvb2wpKSksCiAgICByZXAoIlNhbGlkYSBpbnRlcmNhbGFkYSIsICAgICAgICAgICBsZW5ndGgod2hpY2goZGZfZm9ybTIkbm9kYXkuYm9vbCkpKSwKICAgIHJlcCgiQm9ubyIsICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChkZl9mb3JtMiRib25vLmJvb2wpKSksCiAgICByZXAoIlVuIG1vbnRvIGRlbCBBZnAiLCAgICAgICAgICAgICBsZW5ndGgod2hpY2goZGZfZm9ybTIkYWZwMS5ib29sKSkpLAogICAgcmVwKCJVbiBwb3JjZW50YWplIGRlbCBBZnAiLCAgICAgICAgbGVuZ3RoKHdoaWNoKGRmX2Zvcm0yJGFmcDIuYm9vbCkpKQopKS9sZW5ndGgoZGZfZm9ybTIkc29jaWFsLmJvb2wpKSAlPiUKICAgIHNvcnQoVFJVRSkgJT4lCiAgICBiYXJwbG90KGhvcml6ID0gVFJVRSwKICAgICAgICAgICAgbGFzID0gMSwKICAgICAgICAgICAgeWxhYiA9ICIiLAogICAgICAgICAgICB4bGFiID0gIkFwcm9iYWNpw7NuIgogICAgKQp0aXRsZSgiQXByb2JhY2nDs24gcG9yIG1lZGlkYSAoZGUgMCBhIDEpIikKYGBgCiMjIyBJbm1vdmlsaXphY2nDs24KYGBge3J9CmRmX2Zvcm0yJHNvY2lhbC4wNSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBiYXJwbG90KHlsYWI9IlBlcnNvbmFzIikKCnRpdGxlKCJEZSAwIGEgNSwgwr9Dw7phbnRvIGRpc21pbnV5ZXJvbiB0dXMgc2FsaWRhcyBkdXJhbnRlIGxhIGN1YXJlbnRlbmE/IikKYGBgCgojIyMgU3VzcGVuc2nDs24gZGUgYWNjZXNvIGEgbHVnYXJlcyBww7pibGljb3MKYGBge3J9CmRmX2Zvcm0yJG9jaW8uMDUgJT4lCiAgICB0YWJsZSgpICU+JQogICAgYmFycGxvdCh5bGFiPSJQZXJzb25hcyIpCgp0aXRsZSgiRGUgMCBhIDUsIMK/Q8O6YW50byBkaXNtaW51eWVyb24gdHVzIHNhbGlkYXMgZHVyYW50ZSBsYSBjdWFyZW50ZW5hPyIpCmBgYAoKIyMjIERpc3Bvc2ljacOzbiBzYWxpZGEgZGUgaG9tYnJlcyB5IG11amVyZXMgZW4gZMOtYXMgY29tcGxlbWVudGFyaW9zCmBgYHtyfQpkZl9mb3JtMiRub2RheS4wNSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBiYXJwbG90KHlsYWI9IlBlcnNvbmFzIikKCnRpdGxlKCJEZWwgMCBhbCA1LCDCv0N1w6FudG8gY2FtYmnDsyB0dXMgc2FsaWRhcz8iKQpgYGAKCiMjIyBNdWx0YSBkZSBTLy44Ni1TLy4zNDAgcGFyYSB0b2RhcyBsYXMgcGVyc29uYXMgcXVlIGRlc29iZWRlY2VuIGRpc3Bvc2ljaW9uZXMgZGVsIGdvYmllcm5vCmBgYHtyfQpkZl9mb3JtMiRtdWx0YS4wNSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBiYXJwbG90KHlsYWI9IlBlcnNvbmFzIikKCnRpdGxlKCJEZSAwIGEgNSwgwr9Dw7phbnRvIGRpc21pbnV5ZXJvbiB0dXMgc2FsaWRhcyBkdXJhbnRlIGxhIGN1YXJlbnRlbmE/IikKYGBgCgojIyMgRW50cmVnYSBkZSBib25vIFMvLiAzODAsIFMvLjc2MCBkZSBhY3VlcmRvIGFsIFNpc3RlbWEgZGUgRm9jYWxpemFjacOzbiBkZSBIb2dhcmVzIChTSVNGT0gpCmBgYHtyfQpkZl9mb3JtMiRib25vLjA1ICU+JQogICAgdGFibGUoKSAlPiUKICAgIGJhcnBsb3QoeWxhYj0iUGVyc29uYXMiKQoKdGl0bGUoIkRlbCAwIGFsIDUsIMK/Q3XDoW50byBzZSByZWR1am8gdHVzIHNhbGlkYXM/IikKYGBgCgojIyMgUmV0aXJvIGRlIGhhc3RhIFMvLiAyMDAwIGRlIGZvbmRvcyBBRlAgZGUgdHJhYmFqYWRvcmVzIGFmaWxpYWRvcyBxdWUgbm8gdGllbmVuIHBsYW5pbGxhCmBgYHtyfQpkZl9mb3JtMiRhZnAxLjA1ICU+JQogICAgdGFibGUoKSAlPiUKICAgIGJhcnBsb3QoeWxhYj0iUGVyc29uYXMiKQoKdGl0bGUoIkRlbCAwIGFsIDUsIMK/IEN1w6FuIG3DoXMgdGUgbWFudHV2aXN0ZSBlbiBjYXNhPyIpCmBgYAoKIyMjIFJldGlybyBkZWwgIDI1JSBkZSBmb25kb3MgQUZQIHBhcmEgdHJhYmFqYWRvcmVzIGFmaWxpYWRvcwpgYGB7cn0KZGZfZm9ybTIkYWZwMi4wNSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBiYXJwbG90KHlsYWI9IlBlcnNvbmFzIikKCnRpdGxlKCJEZWwgMCBhbCA1LCDCv0N1w6FudG8gdGllbXBvIG3DoXMgdGUgbWFudHV2byBlbiBjYXNhPyIpCmBgYAoKIyMjIERpc3RyaXRvIHZzIGluZ3Jlc28KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0yMH0KIyBObyBzdXBlIGNvbW8gaGFjZXJsbyBjb24gdmFuaWxsYSBSCmdncGxvdChhZXMoeSA9IGRpc3RyaXRvLCB4ID0gaW5ncmVzbyksIGRhdGEgPSBkZl9mb3JtMikgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgZ2d0aXRsZSgiRGlzdHJpdG9zIHZzIGluZ3Jlc29zIikgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAojIyMgRGlzdHJpdG8gdnMgY2Fzb3MKYGBge3J9CnBhcihtYWkgPSBjKDEsIDIsIDAuMiwgMC41KSkKZGYgJT4lIGZpbHRlcihQUk9WSU5DSUEgPT0gIkxJTUEiKSAlPiUKICAgIGZpbHRlcihESVNUUklUTyAlaW4lIGMoIk1JUkFGTE9SRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQkFSUkFOQ08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU0FOIElTSURSTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQU5USUFHTyBERSBTVVJDTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQU4gQk9SSkEiKQogICAgICAgICAgICkgLT4gaW5mZWN0YWRvc181ICMgRXMgbmVjZXNhcmlvIGx1ZWdvCgppbmZlY3RhZG9zXzUgJT4lCiAgICBzZWxlY3QoRElTVFJJVE8pICU+JQogICAgdGFibGUoKSAlPiUKICAgIHNvcnQoVFJVRSkgJT4lCiAgICBiYXJwbG90KGxhcz0xLCBob3Jpej1UUlVFLCB4bGFiPSJDYXNvcyIpCnRpdGxlKCJDYXNvcyBlbiBhbGd1bm9zIGRpc3RyaXRvcyIpCmBgYAoKIyMjIERpc3RyaXRvIHZzIGluZ3Jlc28gb3RyYSB2ZXoKYGBge3J9CmRmX2Zvcm0yICU+JQogICAgZmlsdGVyKGRpc3RyaXRvICVpbiUgYygiTWlyYWZsb3JlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXJyYW5jbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW4gSXNpZHJvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbnRpYWdvIGRlIFN1cmNvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbiBCb3JqYSIpCiAgICAgICAgICAgKSAtPiBkZl81CmdncGxvdChhZXMoeSA9IGRpc3RyaXRvLCB4ID0gaW5ncmVzbyksIGRhdGEgPSBkZl81KSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICBnZ3RpdGxlKCI1IGRpc3RyaXRvcyB2cyBpbmdyZXNvcyIpICMgQcO6biBubyBoYSByZXNwb25kaWRvIG5hZGllIGRlIE1pcmFmbG9yZXMuCmBgYAoKIyMjIERpc3RyaXRvIHZzIGVtcGxlbwpgYGB7cn0KZ2dwbG90KGFlcyh5ID0gZGlzdHJpdG8sIHggPSBlbXBsZW8pLCBkYXRhID0gZGZfNSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgZ2d0aXRsZSgiNSBkaXN0cml0b3MgdnMgdGlwbyBkZSBlbXBsZW8iKQpgYGAKCiMjIyBEZXNhY2VsZXJhY2nDs24gZGVsIGNvbnRhZ2lvCmBgYHtyfQpkZl9mb3JtMiRkZWNjZWxlcmF0aW9uICU+JQogICAgdW5saXN0KCkgJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGtuaXRyOjprYWJsZShjb2wubmFtZXMgPSBjKCJNZWRpZGEiLCAiUGVyc29uYXMgcXVlIGxvIGFwcnVlYmFuIikpCmBgYAoKIyMjIEFjZWxlcmFjacOzbiBkZWwgY29udGFnaW8KYGBge3J9CmRmX2Zvcm0yJGFjY2VsZXJhdGlvbiAlPiUKICAgIHVubGlzdCgpICU+JQogICAgdGFibGUoKSAlPiUKICAgIHNvcnQoVFJVRSkgJT4lCiAgICBrbml0cjo6a2FibGUoY29sLm5hbWVzID0gYygiRmFjdG9yIiwgIlBlcnNvbmFzIHF1ZSBsbyBhcHJ1ZWJhbiIpKQpgYGAKCiMjIERlc2NyaXB0b3JlcyBudW3DqXJpY29zIHBhcmEgbGFzIHZhcmlhYmxlcyBkZSBtYXlvciBpbXBvcnRhbmNpYToKCiMjIyBEYXRhIHdlYgoqIEZyZWN1ZW5jaWEgZGUgc2FsaWRhIGRlIHBlcnNvbmFzIChhbnRlcyB5IGRlc3B1w6lzKTogVXRpbGl6YW1vcyBtZWRpYW5hIHkgbWVkaWEuCiogQ2FudGlkYWQgZGUgaW5mZWN0YWRvcyBwb3IgZMOtYTogVXRpbGl6YW1vcyBtZWRpYS4KKiBFZGFkOiBVdGlsaXphbW9zIGxhIG1lZGlhbmEgcGFyYSByZWxhY2lvbmFyIHJhbmdvcyBkZSBlZGFkZXMgY29uIGxhcyByZXB1ZXN0YXMgYnJpbmRhZGFzIHBvciBsYXMgcGVyc29uYXMgZW4gbGFzIGVuY3Vlc3Rhcy4KCiMjIyBFbmN1ZXN0YXMKU2UgcmVhbGl6YXLDoSB1bmEgZW5jdWVzdGEgcGFyYSBhcHJveGltYWRhbWVudGUgMTAwIHBlcnNvbmFzLCBlbiBlbCBjdWFsIHNlIGZvcm11bGFyw6FuIHByZWd1bnRhcyBjb24gbGFzIHNpZ3VpZW50ZXMgdmFyaWFibGVzOgoqIEZyZWN1ZW5jaWEgZGUgc2FsaWRhIHByb21lZGlvIGFsIGTDrWEgYW50ZXMgZGVsIGluaWNpbyBkZSBjdWFyZW50ZW5hCiogRnJlY3VlbmNpYSBkZSBzYWxpZGEgcHJvbWVkaW8gYWwgZMOtYSBsdWVnbyBkZSBsYSBtZWRpZGEgZGVsIGdvYmllcm5vCiogQ2FudGlkYWQgIGFwcm94aW1hZGEgZGUgcGVyc29uYXMgcXVlIG9ic2VydsOzIGVuIGx1Z2FyZXMgcMO6YmxpY29zIChtZXJjYWRvLCBob3NwaXRhbCkgbHVlZ28gZGUgYXBsaWNhZGFzIGxhcyBtZWRpZGFzIGRlbCBnb2JpZXJuby4gRXN0byBzZSBtZWRpcsOhIG1lZGlhbnRlIHVuIGluZGljYWRvciBjYXRlZ8OzcmljbyBvcmRpbmFsLgoqIENhbnRpZGFkIGRlIHBlcnNvbmFzIGFwcm94aW1hZGEgcXVlIG9ic2VydsOzIGN1bXBsaXIgY29uIGVsIGRpc3RhbmNpYW1pZW50byBzb2NpYWwgZGUgMSBtZXRybywgbHVlZ28gZGUgbGFzIG1lZGlkYXMgZGVsIGdvYmllcm5vLiBFc3RvIHNlIG1lZGlyw6EgbWVkaWFudGUgdW4gaW5kaWNhZG9yIGNhdGVnw7NyaWNvIG9yZGluYWwKKiBUaXBvIGRlIHRyYWJham8gKGZvcm1hbCAvIGluZm9ybWFsKQoqIEVkYWQKKiBHw6luZXJvCiogRGlzdHJpdG8KKiBDbGFzZSBzb2NpYWwKKiBOaXZlbCBlZHVjYXRpdm8KCiMgRGVzY3JpcHRvcmVzIGdyw6FmaWNvcwoKVXRpbGl6YXJlbW9zOgoKR3LDoWZpY2EgZGUgZGlzcGVyc2nDs24gcGFyYSBub3RhciBmw6FjaWxtZW50ZSBjb21vIGF1bWVudGEgbyBkZWNyZWNlIGxhIGNhbnRpZGFkIGRlIGluZmVjdGFkb3MgZSBpbmZlY3RhZG9zIHBvciBkaWEgYW50ZXMgeSBkZXNwdcOpcyBkZSBxdWUgc2UgYXBsaXF1ZSBsYSBtZWRpZGEuCkFkZW3DoXMsIGxhIGdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuIG5vcyBwdWVkZSBheXVkYXIgYSBlbmNvbnRyYXIgdW5hIHJlbGFjacOzbiB5L28gcGF0csOzbiBlbnRyZSBsYSBjYW50aWRhZCBkZSBpbmZlY3RhZG9zIHkvbyBtb3ZpbGl6YWNpw7NuIHNvY2lhbCB5IGxvcyBkw61hcyB0cmFuc2N1cnJpZG9zIGRlc2RlIHF1ZSBzZSBlbXBsZcOzIGNhZGEgbWVkaWRhLgoKIyBPYnRlbmNpw7NuIHkgUHJvY2VzYW1pZW50byBkZSBSZXN1bHRhZG9zCgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQpyZXBlYXRfcGxvdHMoIjIwMjAtMDMtMTUiLCAxMCwgIkRlY2xhcmFjacOzbiBkZSBFc3RhZG8gZGUgRW1lcmdlbmNpYSIpCnJlcGVhdF9wbG90cygiMjAyMC0wMy0xOCIsIDEwLCAiQXByb2JhY2nDs24gZGVsIFBhZHLDs24gZGUgSG9nYXJlcyIpCnJlcGVhdF9wbG90cygiMjAyMC0wNC0wMyIsIDEwLCAiU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybyIpCnJlcGVhdF9wbG90cygiMjAyMC0wNC0yMCIsIDEwLCAiUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGJhc2ljb3MiKQpgYGAKCiMgRGlzY3VzacOzbiBkZSByZXN1bHRhZG9zCgojIyBQYXRyb25lczoKKiBQdWRpbW9zIG5vdGFyIHF1ZSBsYSBjdXJ2YSBkZSBjYXNvcyB0b3RhbGVzIG11ZXN0cmEgdW4gY3JlY2ltaWVudG8gY29udGludW8gZW4gZWwgdGllbXBvLCBldmlkZW5jacOhbmRvc2UgdW4gaW5jcmVtZW50byBkZSBwZXJzb25hcyBpbmZlY3RhZGFzIHNpZ25pZmljYXRpdm8gIGVudHJlIGFudGVzIHkgZGVzcHXDqXMgZGUgaGFiZXIgdG9tYWRvIGNhZGEgbWVkaWRhLgoqIEVuIGN1YW50byBhIGxvcyBudWV2b3MgY2Fzb3MgcG9yIGTDrWEgcHVkaW1vcyBub3RhciBxdWUgdG9kYXMgbGFzIGdyw6FmaWNhcyBtdWVzdHJhbiB1bmEgdmFyaWFjacOzbiBjb25zaWRlcmFibGUgZW4gbGEgY2FudGlkYWQgZGUgY2Fzb3MgZGlhcmlvcyBwb2NvcyBkw61hcyBkZXNwdcOpcyBkZSBxdWUgc2UgYXBsaWNhcmEgY2FkYSBtZWRpZGEuIEVzdGFzIHZhcmlhY2lvbmVzIHNlIHZlbiBjb21vIGRhdG9zIGF0w61waWNvcyBlbiBsYXMgZ3LDoWZpY2FzLgoqIEVuIGxhcyBncsOhZmljYXMgZGUgbW92aWxpemFjacOzbiBzb2NpYWwgc2kgc2UgcHVlZGUgdmVyIGNsYXJhbWVudGUgZWwgZWZlY3RvIGRlIGxhcyBtZWRpZGFzIHJlc3BlY3RpdmFzIGVuIGVsbGFzLiBFbCBlc3RhZG8gZGUgZW1lcmdlbmNpYSBoaXpvIHF1ZSBsYSBtb3ZpbGl6YWNpw7NuIHNvY2lhbCBkaXNtaW51eWVyYSBlbiBncmFuIG1lZGlkYSB5IGxhIG5vcm1hIGRlIHNhbGlyIGTDrWFzIGVzcGVjw61maWNvcyBkZSBsYSBzZW1hbmEgdGFtYmnDqW4gdHV2byB1biBpbXBhY3RvIGVuIGxhIG1vdmlsaXphY2nDs24gY2llcnRvcyBkw61hcyBkZSBsYSBzZW1hbmEuCgoKIyBCaWJsaW9ncmFmw61hCgotIEdvb2dsZSBMTEMuICgyMDIwKS4gR29vZ2xlIENPVklELTE5IENvbW11bml0eSBNb2JpbGl0eSBSZXBvcnRzIFBlcnUuLiBSZWN1cGVyYWRvIGVsIDcgZGUgbWF5byBkZSAyMDIwLCBkZSBHb29nbGUgTExDIFNpdGlvIFdlYjogaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vY292aWQxOS9tb2JpbGl0eS8yMDIwLTA0LTExX1BFX01vYmlsaXR5X1JlcG9ydF9lbi5wZGYKLSBBbsOzbmltbyAoMjAyMCkuIEFjY2lvbmVzIGFkb3B0YWRhcyBwb3IgZWwgZ29iaWVybm8gYW50ZSBDT1ZJRC0xOS4gUmVjdXBlcmFkbyBlbCA3IGRlIG1heW8gZGUgMjAyMCwgZGUgVmVsb3NlIFNpdGlvIFdlYjogaHR0cHM6Ly93d3cudmVsb3NlLnBlL25vdGljaWFzL2FjY2lvbmVzLWFkb3B0YWRhcy1wb3ItZWwtZ29iaWVybm8tYW50ZS1jb3ZpZC0xOS8KLSBHb2JpZXJubyBkZWwgUGVyw7ogKDIwMjApLiBOb3JtYXRpdmEgc29icmUgRXN0YWRvIGRlIEVtZXJnZW5jaWEgcG9yIENvcm9uYXZpcnVzLiBSZWN1cGVyYWRvIGVsIDcgZGUgbWF5byBkZSAyMDIwIGRlIFBsYXRhZm9ybWEgZGlnaXRhbCBkZWwgRXN0YWRvIFBlcnVhbm8gU2l0aW8gV2ViOiBodHRwczovL3d3dy5nb2IucGUvaW5zdGl0dWNpb24vcGNtL2NvbGVjY2lvbmVzLzc4Ny1ub3JtYXRpdmEtc29icmUtZXN0YWRvLWRlLWVtZXJnZW5jaWEtcG9yLWNvcm9uYXZpcnVzCi0gRGVmZW5zb3LDrWEgZGVsIFB1ZWJsbyAoMjAyMCkuIENPTVBFTkRJTyBERSBOT1JNQVMgRU1JVElEQVMgUE9SIEVMIEVTVEFETyBQRVJVQU5PIFBBUkEgQUZST05UQVIgTEEgUFJPUEFHQUNJw5NOIERFTCBDT1ZJRC0xOS4gUmVjdXBlcmFkbyBlbCA3IGRlIG1heW8gZGUgMjAyMCBkZSBEZWZlbnNvcmlhIGRlbCBQdWVibG8gU2l0aW8gV2ViOiBodHRwczovL3d3dy5kZWZlbnNvcmlhLmdvYi5wZS93cC1jb250ZW50L3VwbG9hZHMvMjAyMC8wNS9Db21wZW5kaW8tZGUtTm9ybWFzLUNPVklEMTktMDcuMDUuMjAyMC5wZGYK